0

このクエリをより速く実行する方法について何かアドバイスはありますか?

SELECT *, p.*
FROM grouped g 
INNER JOIN form p 
on p.id = g.id 

LEFT JOIN prospect ps 
ON (p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax) AND p.appphone != '' 
WHERE p.agname like '%test%'
ORDER BY p.agname DESC 
limit 0, 100

ONをORを使用しないように変更すると、すぐに実行されます。このように、30〜40秒かかります。

p.appphone、phone_bus、phone_res、phone_fax、および p.agname はすべてテーブルでインデックス化されています。

4

2 に答える 2

0

内部結合を行っていますが、適切にインデックスが付けられていれば高速になるはずです。一致 '%test%' の左結合は、おそらく時間がかかっている場所です。

最大 60,000 行を通過し (すべての列を選択しています)、フィールド agname に到達すると、文字列を走査して、文字列内のどこかで単語 test を 60,000 回一致させる必要があります。「%test%」を最適化すると思いますが、これがどうにもならない場合は...

appphone - いくつの異なるシナリオがあるか --

ON (**p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax**) AND p.appphone != ''

キーで結合してから、ネストされた OR ステートメントを WHERE 句で使用できますか?

たぶん、どこで p.appphone <> phone_print か、このネストされた OR ステートメントを含む何かを言うことができますが、それを最適化して、可能性のあるものの 3 つの異なるインスタンスの代わりに、そうでないものを探すだけです.... p. appphone 本当に = '' または null ですか? どれくらい速くなるか正確にはわかりませんが、前述のように、左側の結合で p.appphone が null でない場所を言うことができます。

于 2012-06-13T19:42:41.663 に答える
0

私はしようとします:

  1. ANY演算子を使用します。
  2. 条項に移動p.appphonne != ''します。WHERE
  3. 正確なSELECTリスト、'cos*にはすでにp.*フィールドが含まれています。

このクエリを試してください:

SELECT *, p.*
  FROM grouped g 
  JOIN form p ON p.id = g.id 
  LEFT JOIN prospect ps
    ON p.appphone = ANY(ps.phone_bus, ps.phone_res, ps.phone_fax) 
 WHERE p.agname LIKE '%test%'
   AND p.appphone != ''
 ORDER BY p.agname DESC 
 LIMIT 0, 100;

EXPLAIN最初のメッセージにクエリの出力を含めてください。

于 2012-06-13T19:56:50.240 に答える