sql >> Database teknologi >  >> RDS >> Mysql

MySQL-indeks for Grupper efter / Bestil efter

Dette burde hjælpe dig. Omskriv din forespørgsel som følger:

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

Opret nu et sammensat indeks på kolonner (c4, c5, c6) med kolonnerne I DEN RÆKKE. Kolonnerne i dit indeks skal vises i samme rækkefølge som kolonnerne i din WHERE-sætning. Ellers vil indekset ikke fungere. Selektiviteten af ​​dette indeks er snæver nok til, at en filsortering på den midlertidige tabel (for gruppen efter) bør være hurtig.

Grunden til at flytte c3 til slutningen af ​​forespørgslen er følgende. Lad os som et eksempel antage, at c3 kan tage værdier mellem 0 og 100 (eller det kan være NULL). Hvis du kører en "IS NOT NULL"-forespørgsel, skal Mysql gennemløbe næsten hele B-Tree-indekset undtagen de kanter, der svarer til NULL. Derfor beslutter MySQL, at en fuld tabelscanning er en nemmere mulighed end at gå gennem alle de forskellige stier i indekset. På den anden side vil du se, at hvis din forespørgsel var en "ER NULL", og dit indeks var (c3, c4, c5, c6), så vil Mysql faktisk bruge dette indeks. Dette skyldes, at Mysql i dette tilfælde kun behøver at krydse den del af indekstræet, der svarer til NULL-værdien.

Den slags indekser, MySQL har brug for, afhænger i høj grad af den pågældende forespørgsel. At oprette indekser på alle kolonnerne, som @louis foreslog, er IKKE en god idé!



  1. Aktivering af SSL eller TLS i Oracle Apps R12

  2. Angivelse af skemaet i Pandas to_sql

  3. PostgreSQL fejl 'Kunne ikke oprette forbindelse til server:Ingen sådan fil eller mappe'

  4. Vis kun en kolonne, hvis den ikke er nul