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

MySQL:sloupce s nízkou mohutností/selektivitou =jak indexovat?

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



  1. Použití podmínky if ve vložení SQL Server

  2. Získejte vygenerované uuid po vložení php

  3. Výchozí heslo mysql na serveru ubuntu 16.04

  4. Klíčové slovo FROM nebylo nalezeno tam, kde se očekávalo (Oracle SQL)