Index, který popisujete, je v podstatě bezpředmětný. Index se nejlépe používá, když potřebujete vybrat malé počet řádků v porovnání s celkovým počtem řádků.
Důvodem je, jak databáze přistupuje k tabulce. Tabulky lze hodnotit buď úplným skenováním tabulek, kde se postupně čte a zpracovává každý blok. Nebo pomocí rowid nebo vyhledávání klíčů, kde databáze má klíč/rowid a čte přesně ten řádek, který vyžaduje.
V případě, že použijete klauzuli where na základě primárního klíče nebo jiného jedinečného indexu, např. where id = 1
může databáze pomocí indexu získat přesný odkaz na místo, kde jsou uložena data řádku. To je jednoznačně efektivnější než provádění úplného skenování tabulky a zpracování každého bloku.
Nyní zpět k vašemu příkladu, máte klauzuli where where status = 'enabled'
, index vrátí 150 m řádků a databáze bude muset číst každý řádek postupně pomocí samostatných malých čtení. Zatímco přístup k tabulce pomocí úplného skenování tabulky umožňuje databázi využívat efektivnější větší čtení.
Existuje bod, kdy je lepší provést úplné prohledání tabulky, než použít index. S mysql můžete použít FORCE INDEX (idx_name)
jako součást vašeho dotazu, abyste umožnili srovnání mezi jednotlivými metodami přístupu k tabulce.
Odkaz:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html