0

次のクエリを最適化しようとしています。

テーブル seafood_tbl には 500 のレコードがあります

テーブル dish_tbl には 10,000 レコードがあります

これを PHPmyadmin で実行すると、実行に 20 秒、つまり永遠にかかります。

SELECT 
SUM(a.squid)
FROM seafood_tbl a
INNER JOIN dishes_tbl b ON 
   ( b.id_group = a.id AND b.choice =0 ) 
   OR 
   ( b.id_chef = a.id_chef AND ISNULL( b.id_group ))
GROUP BY a.id

結合で参照されるすべてのフィールドにインデックスがあります。私は、dishes_tbl で OPTIMIZE TABLE を実行しました。

これが Explain からの出力です。

1   SIMPLE  a   ALL PRIMARY NULL    NULL    NULL    505 Using temporary; Using filesort
1   SIMPLE  b   ref_or_null choice_index,id_group_index,id_chef id_group_index  5   a.id    4   Using where

私のクエリに何かひどく問題がありますか、それとも別の場所を探すべきですか?

4

2 に答える 2

0

したがって、JOIN で OR を使用するのは恐ろしい考えであることがわかります。クエリを結合された 2 つの SELECT に分割し、それぞれが 1 つの条件で結合するだけで、クエリが無限に高速化されました。

于 2012-07-03T13:20:01.093 に答える
0
SELECT  SUM(a.squid) 
FROM    seafood_tbl a 
INNER JOIN dishes_tbl b
        ON ( b.id_group = a.id AND b.choice = 0 )  
            OR (ISNULL( b.id_group ) AND b.id_chef = a.id_chef) 
GROUP BY a.id 

2 つのインデックスを作成します。

  • INDEX(料理_tbl.id_group、料理_tbl.id_chef、料理_tbl.選択)
  • INDEX(a.id, a.id_chef, a.squid)

2 つのインデックスの列の順序は、最適ではない可能性があります。

于 2012-07-03T10:31:08.540 に答える