1

このリクエストが遅くなる理由を知っていますか (それ以外の場合は高速な MySQL サーバーで 1.7 秒):

SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A,TABLE_B 
WHERE TABLE_A.keyB= TABLE_B.keyB 
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;

によって与えられたこの実行計画ではEXPLAIN:

id    select_type table       type    possible_keys         key                   key_len   ref     rows     Extra 
1     SIMPLE      TABLE_B     index   PRIMARY               PRIMARY               8     NULL      10     Using index; Using temporary
1     SIMPLE      TABLE_A     ref     IDX_TABLE_A_KEY_B     IDX_TABLE_A_KEY_B     8     TABLE_B.keyB     25455     Using where

その他の要素 :

  • テーブル TABLE_A には 300 000 行あります
  • TABLE_A.keyA は TABLE_A の主キーです
  • TABLE_A.keyB は、 TABLE_B の主キー keyB に対する外部キーです。テーブル TABLE_B には 10 行あります。
  • TABLE_A の 99 % には fieldC=1 があり、テーブルの 1 % には fieldC が (0,2,5,7,8) にあります (このため、このフィールドはインデックス化されていません。EDIT この句は問題ではありません。節ですが、TABLE_B との結合は高速です) ;
  • テーブルでの単純な SELECT は高速であるため、有罪なのは JOIN であるように私には思えます。
  • 別のテーブル TABLE_C との結合も非常に低速です。
  • MySQL バージョン: 5.1.23a-maria-alpha

何か考えはありますか?

4

5 に答える 5

5

TABLE_A の 99 % には fieldC=1 があり、テーブルの 1 % には fieldC が (0,2,5,7,8) にあります (このため、このフィールドはインデックス化されていません

これは、列にインデックスを付ける優れた理由になります。あなたのクエリはテーブルの 1% 未満しか必要としないため、インデックスは非常に選択的です。

于 2011-08-17T09:48:42.987 に答える
2

おそらくIN句、それらは非常に遅くなる傾向があります。インデックスはありTABLE_A.fieldCますか?

于 2011-08-17T09:47:11.637 に答える
0

試す

SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A
WHERE TABLE_A.keyB IN (SELECT TABLE_B.keyB FROM TABLE_B )
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;
于 2011-08-17T09:49:05.447 に答える
0
SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A 
INNER JOIN TABLE_B ON TABLE_A.keyB = TABLE_B.keyB 
WHERE 
TABLE_A.fieldC IN (0, 2, 5, 7, 8) LIMIT 20;

それを試してみてください。

于 2011-08-17T09:47:11.417 に答える
0

列 fieldC にインデックスを追加します。次に、クエリを実行します

Select DISTINCT keyA from 
 (select keyA, keyB from TABLE_A where fieldC in (0,2,5,7,8)) 
as temp STRAIGHT_JOIN TABLE_B on temp.keyB=TABLE_B.keyB limit 20

直線結合と内部結合を試してください。

于 2011-08-17T10:10:49.097 に答える