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

MySql nægter at bruge indeks

MySQL vil ikke bruge indekset, hvis det vurderer, at det ville vælge en betydeligt stor del af tabellen, og det mener, at en tabelscanning faktisk er mere effektiv i disse tilfælde.

Analogt er dette grunden til, at indekset for en bog ikke indeholder meget almindelige ord som "den" -- fordi det ville være spild af tid at slå ordet op i indekset og finde listen over sidetal er en meget lang liste, selv hver side i bogen. Det ville være mere effektivt blot at læse bogen fra omslag til omslag.

Min erfaring er, at dette sker i MySQL, hvis en forespørgsels søgekriterier ville matche mere end 20% af tabellen, og dette er normalt det rigtige krydspunkt. Der kan være en vis variation baseret på datatyperne, tabellens størrelse osv.

Du kan give et hint til MySQL for at overbevise det om, at en tabelscanning ville være uoverkommelig dyr, så det ville være meget mere sandsynligt at bruge indekset. Dette er normalt ikke nødvendigt, men du kan gøre det sådan her:

SELECT taskid FROM tasktransitions FORCE INDEX (transitiondate_ix)
WHERE transitiondate>'2013-09-31 00:00:00';


  1. Vender tilbage fra en funktion med OUT parameter

  2. Når en ny række i databasen tilføjes, skal et eksternt kommandolinjeprogram startes

  3. JPA-indbygget forespørgsel for LONGTEXT-feltet i en MySQL-visning resulterer i fejl

  4. LocalDateTime , ZonedDateTime og Timestamp