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

Proč mysql hit index při zalamování sloupců s funkcí data

Je známo, že zpráva EXPLAIN je obtížně interpretovatelná. Přetížili příliš mnoho informací do několika polí. Můžete zkusit

type: index označuje, že provádí index-scan , což znamená, že navštěvuje každý záznam v indexu.

To navštíví stejný počet záznamů jako skenování tabulky, kromě toho, že je to proti sekundárnímu indexu namísto klastrovaného (primárního) indexu.

Když vidíme type: index , EXPLAIN zobrazuje possible_keys: NULL což znamená, že nemůže používat žádný index pro efektivní vyhledávání. Ale také zobrazuje key: add_time což znamená, že index, který používá pro skenování indexu, je add_time .

Skenování indexu je způsobeno skutečností, že MySQL nedokáže sama optimalizovat výrazy nebo volání funkcí. Pokud byste se například pokusili vyhledat data s konkrétním měsícem, můžete hledat month(add_time) = 4 ale to by nepoužilo index na add_time, protože data s daným měsícem jsou v indexu roztroušena a nejsou všechna seskupena.

Možná znáte, že date(add_time) by mělo být možné prohledávat podle indexu, ale MySQL to nevyvozuje. MySQL pouze vidí, že používáte funkci, a ani se nepokusí použít index.

Proto MySQL 5.7 zavedlo generované sloupce abychom mohli indexovat výraz, a MySQL 8.0 to ještě vylepšilo tím, že umožnilo index k definovanému pro výraz aniž bychom museli nejprve definovat vygenerovaný sloupec.



  1. Postgres tabulka do dvourozměrného pole

  2. Jak funguje LOG2() v MariaDB

  3. Získejte datový rámec R se sloučenými hodnotami z více tabulek MySQL

  4. MySQL Čtení ze streamu se nezdařilo