問題は、MySQLがクエリの実行時に1つのインデックスのみを使用することです。 WHERE
の3つのフィールドを使用する新しいインデックスを追加する場合 句を指定すると、行がより速く見つかります。
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
MySQLのドキュメントによると、ORDERBY最適化> :
これはあなたの場合に起こることです。EXPLAIN
の出力として オプティマイザーはキーprice
を使用します 行を検索します。ただし、ORDER BY
date_updated
フィールドにあります キーprice
に属していない 。
行をすばやく見つけて並べ替えるには、WHERE
で使用されるすべてのフィールドを含むインデックスを追加する必要があります。 およびORDER BY
条項:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
並べ替えに使用するフィールドは、インデックスの最後の位置にある必要があります。 price
を含めるのは無意味です クエリで使用される条件は値の範囲を返すため、インデックス内にあります。
EXPLAIN
の場合 それでもfilesortを使用していることが示されている場合は、選択したインデックスをMySQLに使用させることができます。
SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC
LIMIT 19990, 10
MySQLオプティマイザはほとんどの場合正しい選択を行うため、通常はインデックスを強制する必要はありません。しかし、時にはそれは悪い選択をするか、最良の選択ではありません。パフォーマンスが向上するかどうかを確認するには、いくつかのテストを実行する必要があります。