sql >> Databasteknik >  >> RDS >> Mysql

MySQL-indexering och Använda filsortering

I din första fråga görs ORDER BY med hjälp av views_point INDEX, eftersom det användes i WHERE-delen av frågan och därför i MySQL kan användas för sortering.

I den andra frågan löser MySQL WHERE-delen med ett annat index, listing_pcs . Detta kan inte användas för att uppfylla ORDER BY-villkoret. MySQL använder istället filesort, vilket är det bästa alternativet om ett index inte kan användas.

MySQL använder bara index för att sortera om indexet är detsamma som det som används i WHERE-villkoret. Det här är handboken betyder genom:

Så vad kan du göra:

  1. Prova att öka din sort_buffer_size config-alternativet för att göra filsortering så effektiv som möjligt. Stora resultat som är för stora för sorteringsbufferten gör att MySQL delar upp sorteringen i bitar, vilket är långsammare.

  2. Tvinga MySQL att välja ett annat index. Det är värt att notera att olika MySQL-versioner väljer standardindex på olika sätt. Version 5.1, till exempel, är ganska dålig eftersom Query Optimizer hade skrivits om mycket för den här utgåvan och behövde mycket förfining. Version 5.6 är ganska bra.

    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. Sanering och validering av formuläret php

  2. Varför infoga-välj till variabeltabell från XML-variabel så långsam?

  3. Hur använder du variabler i ett enkelt PostgreSQL-skript?

  4. KONTROLLERA begränsning på födelsedatum?