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]