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

MySQL bruger ikke indeks ved kontrol af =1 , men bruger det med =0

Hvorfor bruger MySQL ikke et indeks?
MySQL vil ikke bruge et indeks, hvis en stor procentdel af rækkerne har den værdi.

Hvorfor vil tilføjelse af use index til forespørgslen ikke virker her
Tilføjelse af et use index klausul vil ikke have nogen effekt, fordi use index vil kun foreslå hvilke indeks at bruge, vil det ikke foreslå, om man skal bruge et indeks eller ej.

Forbehold ved brug af testtabeller med få rækker
Dette er især irriterende, når du bruger testtabeller med få rækker, da MySQL vil nægte at bruge et indeks, og det er svært at se, hvad der er galt med din forespørgsel.
Så sørg for at tilføje nok rækker til en testtabel at gøre det til en realistisk test.

Er det nytteløst at bruge et indeks på kolonner med lav kardinalitet?
Indeksering på booleske kolonner er ikke så nyttigt som du troede, før du stillede dette spørgsmål.
Men det er heller ikke ubrugeligt enten.
Med InnoDB MySQL vil forsøge at hente data ved hjælp af indekserne, hvis det er muligt, hvis dit booleske felt har et indeks, forespørgslen:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

Kan læse alle data i det dækkende indeks for bool_field fordi sekundære indekser i InnoDB altid inkluderer det primære indeks (id) også.
Dette er hurtigere, fordi MySQL ikke behøver at læse hele tabellen ind i hukommelsen.

I MyISAM virker dette ikke, og MySQL vil undersøge hele tabellen.

Men jeg kan bruge force index
Det kan du, men på indekser med lav kardinalitet vil det gøre din forespørgsel langsommere, ikke hurtigere. Tilsidesæt kun indekserne på komplekse forespørgsler og kun hvis du kender reglerne MySQL bruger til at vælge indekser.

Links:
Se:http://dev.mysql .com/doc/refman/5.1/da/mysql-indexes.html
og: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

Hvis du vil have en bog om dette emne:læs
High performance MySQL:http://oreilly.com /catalog/9780596003067



  1. Generisk Ruby-løsning til SQLite3 LIKE eller PostgreSQL ILIKE?

  2. Sammenføjning af forskellige tabeller baseret på kolonneværdi

  3. Oracle vælg seneste datopost

  4. Generer klasse fra databasetabel