sql >> Database >  >> RDS >> Mysql

MySQL-index voor groeperen op / bestellen op

Dit zou je moeten helpen. Herschrijf uw vraag als volgt:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)
AND c3 IS NOT NULL   
GROUP BY c1

Maak nu een samengestelde index op kolommen (c4, c5, c6) met de kolommen IN DIE VOLGORDE. De kolommen in uw index moeten in dezelfde volgorde verschijnen als de kolommen in uw WHERE-clausule. Anders werkt de index niet. De selectiviteit van deze index is smal genoeg om een ​​bestandssortering op de tijdelijke tabel (voor de groep op) snel te laten zijn.

De reden om c3 naar het einde van de query te verplaatsen is de volgende. Laten we als voorbeeld aannemen dat c3 waarden tussen 0 en 100 kan aannemen (of het kan NULL zijn). Als u een "IS NOT NULL"-query uitvoert, moet Mysql bijna de hele B-Tree-index doorlopen, behalve de randen die overeenkomen met NULL. Daarom besluit MySQL dat een volledige tabelscan een gemakkelijkere optie is dan door alle verschillende paden in de index te lopen. Aan de andere kant zul je zien dat als je zoekopdracht een "IS NULL" was en je index was (c3, c4, c5, c6), Mysql deze index in feite zal gebruiken. Dit komt omdat Mysql in dit geval alleen het deel van de indexboom hoeft te doorlopen dat overeenkomt met de NULL-waarde.

Het soort indexen dat MySQL nodig heeft, is sterk afhankelijk van de vraag in kwestie. Indexen maken op alle kolommen, zoals @louis suggereerde, is GEEN goed idee!



  1. Tien veelvoorkomende bedreigingen voor de kwaliteit van uitvoeringsplan

  2. Laravel klaagt over zoekopdracht met dubbele benoemde parameters

  3. Speciale tekens opslaan in MySQL-database

  4. Voer MySQL-query uit op een externe computer via ssh in de opdrachtregel