sql >> Database >  >> RDS >> Mysql

MySQL-indexering en filesort gebruiken

In uw eerste zoekopdracht wordt de ORDER BY gedaan met behulp van het views_point INDEX, omdat het werd gebruikt in het WHERE-gedeelte van de zoekopdracht en daarom in MySQL kan worden gebruikt om te sorteren.

In de tweede query lost MySQL het WHERE-gedeelte op met een andere index, listing_pcs . Dit kan niet worden gebruikt om te voldoen aan de ORDER BY-voorwaarde. MySQL gebruikt in plaats daarvan filesort, wat de beste optie is als een index niet kan worden gebruikt.

MySQL gebruikt alleen indexen om te sorteren als de index dezelfde is als die gebruikt in de WHERE-voorwaarde. Dit is wat de handleiding betekent door:

Dus wat kun je doen:

  1. Probeer uw sort_buffer_size te vergroten config-optie om bestandssortering zo effectief mogelijk te maken. Grote resultaten die te groot zijn voor de sorteerbuffer, zorgen ervoor dat MySQL de sortering in stukken opdeelt, wat langzamer gaat.

  2. Forceer MySQL om een ​​andere index te kiezen. Het is vermeldenswaard dat verschillende MySQL-versies standaardindexen anders kiezen. Versie 5.1 is bijvoorbeeld behoorlijk slecht omdat de Query Optimizer voor deze release enorm was herschreven en veel verfijning nodig had. Versie 5.6 is redelijk goed.

    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
    


  1. Is het mogelijk om een ​​nieuwe rij bovenaan de MySQL-tabel in te voegen?

  2. Hoe praat Access met ODBC-gegevensbronnen? Deel 5

  3. Inleiding tot C

  4. Ruby on Rails 3 Kan geen verbinding maken met lokale MySQL-server via socket '/tmp/mysql.sock' op OSX