sql >> Databáze >  >> RDS >> Mysql

Index MySQL pro seskupit podle / seřadit podle

To by vám mělo pomoci. Přepište svůj dotaz následovně:

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

Nyní vytvořte složený index na sloupcích (c4, c5, c6) se sloupci V TOMTO POŘADÍ. Sloupce ve vašem indexu by se měly objevit ve stejném pořadí jako sloupce v klauzuli WHERE. Jinak index nebude fungovat. Selektivita tohoto indexu je natolik úzká, že řazení souborů v dočasné tabulce (pro skupinu podle) by mělo být rychlé.

Důvod pro přesunutí c3 na konec dotazu je následující. Jako příklad předpokládejme, že c3 může nabývat hodnot mezi 0 a 100 (nebo může být NULL). Pokud spustíte dotaz "IS NOT NULL", pak Mysql potřebuje projít téměř celý index B-Stromu kromě hran, které odpovídají NULL. Proto se MySQL rozhodne, že úplné prohledání tabulky je jednodušší možností než procházet všemi různými cestami v indexu. Na druhou stranu uvidíte, že pokud byl váš dotaz "IS NULL" a váš index byl (c3, c4, c5, c6), pak Mysql ve skutečnosti použije tento index. Je to proto, že v tomto případě Mysql potřebuje procházet pouze část indexového stromu odpovídající hodnotě NULL.

Druh indexů, které MySQL potřebuje, do značné míry závisí na příslušném dotazu. Vytváření indexů ve všech sloupcích, jak navrhl @louis, NENÍ dobrý nápad!



  1. Závažná chyba:Volání nedefinované funkce sqlsrv_connect()

  2. JDBC vrací prázdnou sadu výsledků

  3. UPDATE, pokud existuje, INSERT v SQL

  4. Profilování databáze v IRI Workbench