1

次のようなクエリがあります。

SELECT product.id FROM products
INNER JOIN supplier ON supplier.id = product.supplier_id
WHERE supplier.country = 'UK'
AND (
(1000 BETWEEN product.date_on AND product.date_off) OR
(2000 BETWEEN product.date_on AND product.date_off) OR
(2000 >= product.date_on AND 
   (product.date_off IS NULL OR 1000 <= product.date_off))
)

そのクエリの実行は遅すぎます。いくつかのインデックスが必要だと思いますが、何を追加すればよいかわかりません。product.date_on と product.date_off にインデックスがありますが、AND 句でこれらの値を複数回比較しているため、インデックスが使用されていないと思います。複合インデックスを使用できるかもしれませんが、これを最適化するために、どのフィールドをどの順序で入れるべきかわかりません。ところで、1000 と 2000 は、私が渡している 2 つの変数です...

4

1 に答える 1

0

クエリを最適化するには、実行計画を検討する必要があります。EXPLAINクエリの前に追加するだけです。

EXPLAIN SELECT product.id FROM products ...

EXPLAIN次のリンクを使用して結果を解釈できますhttp://dev.mysql.com/doc/refman/5.0/en/explain-output.html

最大の部分を見て、rowsこの部分を最適化する方法を考えてください。possible_keysヒントとして使用します。

于 2013-11-13T10:39:34.247 に答える