sql >> Database teknologi >  >> RDS >> Mysql

MySQL:kolonner med lav kardinalitet/selektivitet =hvordan indekseres?

Indekset, som du beskriver, er stort set meningsløst. Et indeks bruges bedst, når du skal vælge en lille antal rækker i forhold til det samlede antal rækker.

Årsagen til dette er relateret til, hvordan en database får adgang til en tabel. Tabeller kan vurderes enten ved en fuld tabelscanning, hvor hver blok aflæses og behandles på skift. Eller ved et række- eller nøgleopslag, hvor databasen har en nøgle/række og læser den nøjagtige række, den kræver.

I det tilfælde, hvor du bruger en where-klausul baseret på den primære nøgle eller et andet unikt indeks, f.eks. where id = 1 , kan databasen bruge indekset til at få en nøjagtig reference til, hvor rækkens data er gemt. Dette er klart mere effektivt end at lave en fuld tabelscanning og behandle hver blok.

Nu tilbage til dit eksempel, du har en where-sætning af where status = 'enabled' , vil indekset returnere 150 m rækker, og databasen skal læse hver række efter tur ved hjælp af separate små læsninger. Hvorimod adgang til tabellen med en fuld tabelscanning gør det muligt for databasen at gøre brug af mere effektive større læsninger.

Der er et tidspunkt, hvor det er bedre bare at lave en fuld tabelscanning i stedet for at bruge indekset. Med mysql kan du bruge FORCE INDEX (idx_name) som en del af din forespørgsel for at tillade sammenligninger mellem hver tabeladgangsmetode.

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



  1. Generer MD5-hash-streng med T-SQL

  2. Sådan indstilles samlingen af ​​en database i SQL Server (T-SQL)

  3. mysql_connect (localhost / 127.0.0.1) langsom på Windows-platformen

  4. Slet duplikerede poster fra en tabel uden pk eller id eller unikke kolonner i mysql