sql >> Database >  >> RDS >> Mysql

Query-optimalisatie voor MySQL-indexgebruik

Een paar dingen... Ik zou een ENKELE samengestelde index hebben op (a_id, job, state, start_time )

Dit om de zoekopdracht op alle criteria te optimaliseren, in wat volgens mij de best afgestemde volgorde is. Een enkele "A_ID", vervolgens twee taken, een klein statusbereik en vervolgens op tijd gebaseerd. Let vervolgens op geen aanhalingstekens... Het lijkt erop dat u numerieke naar tekenreeksvergelijkingen converteerde, laat ze als numeriek achter om te vergelijken -- sneller dan tekenreeksen.

Door ze allemaal als onderdeel van de index te hebben, is het een DEKKENDE index, wat betekent dat het NIET naar de onbewerkte paginagegevens hoeft te gaan om de andere waarden te krijgen om te testen of de kwalificerende records al dan niet worden opgenomen.

SELECT 
      count(*) AS tries 
   FROM 
      tasks
   WHERE 
          a_id = 614
      AND job IN ( 1, 3 ) 
      AND state > 80 AND state < 100 
      AND start_time >= 1386538013;

Nu, de waarom de index... overweeg het volgende scenario. Je hebt twee kamers die dozen hebben... In de eerste kamer is elke doos een "a_id", daarbinnen zijn de banen in volgorde, binnen elke baan zijn de statusbereiken en ten slotte de starttijd.

In een andere kamer worden je dozen gesorteerd op starttijd, binnen die a_id worden ze gesorteerd en tenslotte staat.

Dat zou gemakkelijker zijn om te vinden wat je nodig hebt. Zo moet je over de indexen denken. Ik ga liever naar het ene vak voor "A_ID =614", dan naar Job 1 en een ander voor Job 3. Binnen elke Job 1, Job 3, pak 80-100 en dan de tijd. U kent uw gegevens en volume echter beter bij elke overweging van de criteria en kunt deze aanpassen.

Ten slotte de count(ID) vs count(*). Het enige waar ik om geef is een gekwalificeerd record. Ik hoef de werkelijke ID niet te weten, aangezien de filtercriteria al zijn gekwalificeerd als al dan niet inbegrepen, waarom zou ik (in dit geval) naar de werkelijke "ID" zoeken.



  1. CSV-gegevens importeren met PHP/MySQL

  2. Combineren van INSERT-instructies in een gegevensmodificerende CTE met een CASE-expressie

  3. Hoe de ASCII-code voor een bepaald personage te vinden in MySQL

  4. Hoe toegang te krijgen tot de structuur en de kolomlijst, datatypes van refcursor te krijgen?