sql >> Databasteknik >  >> RDS >> Mysql

MySQL-index för Group By / Order By

Detta borde hjälpa dig. Skriv om din fråga enligt följande:

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

Skapa nu ett sammansatt index på kolumner (c4, c5, c6) med kolumnerna I DEN ORDNINGEN. Kolumnerna i ditt index ska visas i samma ordning som kolumnerna i din WHERE-sats. Annars fungerar inte indexet. Selektiviteten för detta index är tillräckligt smal för att en filsortering i den temporära tabellen (för gruppen efter) ska vara snabb.

Anledningen till att flytta c3 till slutet av frågan är följande. Som ett exempel, låt oss anta att c3 kan ta värden mellan 0 och 100 (eller så kan det vara NULL). Om du kör en "IS NOT NULL"-fråga, måste Mysql gå igenom nästan hela B-Tree-indexet förutom kanterna som motsvarar NULL. Därför beslutar MySQL att en fullständig tabellskanning är ett enklare alternativ än att gå igenom alla olika vägar i indexet. Å andra sidan kommer du att se att om din fråga var en "IS NULL" och ditt index var (c3, c4, c5, c6) så kommer Mysql att använda detta index. Detta beror på att Mysql i det här fallet bara behöver gå igenom den del av indexträdet som motsvarar NULL-värdet.

Vilken typ av index MySQL behöver beror mycket på frågan i fråga. Att skapa index på alla kolumner, som @louis föreslog, är INTE en bra idé!



  1. Simulera fördröjningsfunktion i MySQL

  2. mysql kombinerade unika nycklar

  3. INFOGA och UPPDATERA en post med hjälp av markörer i Oracle

  4. skriv om anslutning och fråga från mysql till PDO