-1

非常にゆっくりと、必要な結果を生成する複雑なクエリがあります。(600秒くらい!)

SELECT * 
FROM   clients 
WHERE  type = 'gold' 
       AND state IN( 'TX', 'WV', 'NV', 'IL' ) 
AND phone not in 
       (
          select phone 
          from clients 
          group by phone
          having count(*) > 1
       )
AND cell not in 
       (
          select cell 
          from clients 
          group by cell
          having count(*) > 1
        )

EXPLAIN SELECT は私に与えます:

id, select_type, table,  Possible_keys,  key,  key_len,  ref,  rows,  Extra
1, PRIMARY, clients, ALL, ndxCLients_state,IGA_Count, , , , 128070, Using where
2, DEPENDENT SUBQUERY, clients, ALL, , , , , 128070, Using temporary; Using filesort
3, DEPENDENT SUBQUERY, clients, index, , idx_Cell, 258, , 3, Using index

ここはどうしようか悩んでいます。電話フィールドのインデックスが必要だと私に伝えようとしていると思います。mysql ワークベンチを使用して、電話フィールドにインデックスを付けました。ここで何が欠けていますか?

4

1 に答える 1

0

多くの場合、LEFT JOIN を使用する方が、INおよびNOT IN

SELECT c.*
FROM clients c
LEFT JOIN (SELECT phone
           FROM clients
           GROUP BY phone
           HAVING COUNT(*) > 1) p
ON c.phone = p.phone
LEFT JOIN (SELECT cell
           FROM clients
           GROUP BY cell
           HAVING COUNT(*) > 1) cl
ON c.cell = p.cell
WHERE p.phone IS NULL AND cl.cell IS NULL
AND type = 'gold'
AND state IN( 'TX', 'WV', 'NV', 'IL' )

phoneとに索引があることを確認してくださいcelltypeおよび/またはのインデックスstateがより有用かどうかに応じて、JOINに使用される場合と使用されない場合がありますがGROUP BY、サブクエリでの最適化に使用されます。

于 2013-07-19T21:55:10.430 に答える