最初のクエリでは、ORDERBYはviews_point
を使用して実行されます INDEX。クエリのWHERE部分で使用されたため、MySQLでは並べ替えに使用できます。
2番目のクエリでは、MySQLは別のインデックスlisting_pcs
を使用してWHERE部分を解決します。 。これは、ORDERBY条件を満たすために使用することはできません。 MySQLは代わりにfilesortを使用します。これは、インデックスを使用できない場合に最適なオプションです。
MySQLは、インデックスがWHERE条件で使用されているものと同じである場合にのみ、インデックスを使用してソートします。これは、マニュアル です。 意味:
では、何ができるでしょうか:
-
sort_buffer_size
を増やしてみてください ファイルソートを可能な限り効果的にするためのconfigオプション。ソートバッファに対して大きすぎる結果が大きいと、MySQLはソートをチャンクに分割しますが、これは遅くなります。 -
MySQLに別のインデックスを選択させる。 MySQLのバージョンが異なれば、デフォルトのインデックスの選択も異なることに注意してください。たとえば、バージョン5.1は、クエリオプティマイザがこのリリース用に大幅に書き直されており、多くの改良が必要だったため、かなり悪いものです。バージョン5.6はかなり良いです。
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10