Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Indizierung und Verwendung von Filesort

In Ihrer ersten Abfrage erfolgt ORDER BY mit dem views_point INDEX, weil es im WHERE-Teil der Abfrage verwendet wurde und daher in MySQL zum Sortieren verwendet werden kann.

In der zweiten Abfrage löst MySQL den WHERE-Teil mit einem anderen Index auf, listing_pcs . Dies kann nicht verwendet werden, um die ORDER BY-Bedingung zu erfüllen. MySQL verwendet stattdessen Filesort, was die beste Option ist, wenn kein Index verwendet werden kann.

MySQL verwendet Indizes nur dann zum Sortieren, wenn der Index derselbe ist wie der in der WHERE-Bedingung verwendete. Dies ist das Handbuch bedeutet durch:

Was können Sie also tun:

  1. Versuchen Sie, Ihre sort_buffer_size zu erhöhen config-Option, um die Dateisortierung so effektiv wie möglich zu gestalten. Große Ergebnisse, die zu groß für den Sortierpuffer sind, führen dazu, dass MySQL die Sortierung in Stücke zerlegt, was langsamer ist.

  2. Erzwinge, dass MySQL einen anderen Index wählt. Es ist erwähnenswert, dass verschiedene MySQL-Versionen Standardindizes unterschiedlich auswählen. Version 5.1 zum Beispiel ist ziemlich schlecht, da der Abfrageoptimierer für diese Version umfassend neu geschrieben wurde und viel Verfeinerung benötigte. Version 5.6 ist ziemlich gut.

    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