sql >> Database >  >> RDS >> Mysql

MySQL:kolommen met lage kardinaliteit/selectiviteit =hoe indexeren?

De index die u beschrijft is vrijwel zinloos. Een index wordt het best gebruikt wanneer u een kleine . moet selecteren aantal rijen in vergelijking met het totale aantal rijen.

De reden hiervoor heeft te maken met hoe een database toegang krijgt tot een tabel. Tabellen kunnen worden beoordeeld door middel van een volledige tabelscan, waarbij elk blok beurtelings wordt gelezen en verwerkt. Of door een rowid of key lookup, waarbij de database een key/rowid heeft en de exacte rij leest die nodig is.

In het geval dat u een waar-clausule gebruikt op basis van de primaire sleutel of een andere unieke index, bijv. where id = 1 , kan de database de index gebruiken om een ​​exacte verwijzing te krijgen naar waar de gegevens van de rij zijn opgeslagen. Dit is duidelijk efficiënter dan het doen van een volledige tafelscan en het verwerken van elk blok.

Terug naar je voorbeeld, je hebt een waar-clausule van where status = 'enabled' , retourneert de index 150 m rijen en moet de database elke rij om de beurt lezen met behulp van afzonderlijke kleine leeswaarden. Terwijl toegang tot de tabel met een volledige tabelscan de database in staat stelt efficiëntere grotere uitlezingen te gebruiken.

Er is een punt waarop het beter is om gewoon een volledige tabelscan uit te voeren in plaats van de index te gebruiken. Met mysql kunt u FORCE INDEX (idx_name) . gebruiken als onderdeel van uw zoekopdracht om vergelijkingen tussen elke tabeltoegangsmethode mogelijk te maken.

Referentie:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html



  1. Hoe het actieve aantal open databaseverbindingen in H2/MySQL te vinden?

  2. Hoe UUID_SHORT() werkt in MariaDB

  3. Resultaat van dynamische SQL in een variabele voor sql-server krijgen

  4. FORALL-instructie met VALUES-OF Bound-clausule in Oracle Database