[前][次][番号順一覧][スレッド一覧]

mysql:1444

From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Tue, 04 Jan 2000 17:32:43 +0900
Subject: [mysql 01444] Re: LEFT JOIN は実用に耐えるか

とみたです。

At Tue, 04 Jan 2000 17:31:21 +0900,
akon <akon@xxxxxxxxxx> wrote:

> mysql> explain select count(*) from TableA left join TableBe using(key1);
> +-----------+------+---------------+------+---------+------+--------+-------+
> | table     | type | possible_keys | key  | key_len | ref  | rows   | Extra |
> +-----------+------+---------------+------+---------+------+--------+-------+
> | TableA    | ALL  | NULL          | NULL |    NULL | NULL | 252790 |       |
> | TableB    | ALL  | PRIMARY       | NULL |    NULL | NULL | 134750 |       |
> +-----------+------+---------------+------+---------+------+--------+-------+
> 2 rows in set (0.00 sec)
> 
> です。よく分かりません。

マニュアル 7.21 によると

| それぞれのテーブルで、type が ALL になっています。これは MySQL が全てのテー
| ブルを全結合することを示します!それぞれのテーブル内の行数分から作った物が
| 調べられるので、とても長い時間がかかります!この場合、74 * 2135 * 74 * 3872
| = 45,268,558,720 行調べることになります。テーブルが肥大化したときにかかる時
| 間を考えてください....

ってなことらしいです。どうやらインデックスがまずいようです。

mysql> show fields from TableA; show fields from TableB;
mysql> show keys from TableA; show keys from TableB;

でテーブル構造やインデックスを確認してみましょう。


> が 要件は あくまで LEFT JOIN なんです。
> Select 句は 実際は、COUNT(*)ではなくいくつかの項目を指定したいわけで
> TableB に一致しないものも含め TableA 全件 なんです。

ああ、なるほど…。

--
とみたまさひろ <tommy@xxxxxxxxxx>

[前][次][番号順一覧][スレッド一覧]

      1441 2000-01-04 16:37 [akon <akon@xxxxxxxxx] LEFT JOIN は実用に耐えるか              
      1442 2000-01-04 16:35 ┗[とみたまさひろ <tomm]                                       
      1443 2000-01-04 17:31  ┗[akon <akon@xxxxxxxxx]                                     
->    1444 2000-01-04 17:32   ┗[とみたまさひろ <tomm]                                   
      1445 2000-01-04 18:37    ┗[akon <akon@xxxxxxxxx]