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

Hvorfor mysql ramte indeks, når kolonneombrydes med datofunktion

EXPLAIN-rapporten er kendt for at være svær at fortolke. De har overlæsset for meget information i nogle få felter. Du kan prøve

type: index angiver, at den laver en indeks-scanning , hvilket betyder, at den besøger hver post i indekset.

Dette besøger det samme antal poster som en tabelscanning, bortset fra at det er mod et sekundært indeks i stedet for det grupperede (primære) indeks.

Når vi ser type: index , EXPLAIN viser possible_keys: NULL hvilket betyder, at den ikke kan bruge noget indeks til at søge effektivt. Men den viser også key: add_time hvilket betyder, at det indeks, den bruger til indeks-scanningen, er add_time .

Indeks-scanningen skyldes, at MySQL ikke selv kan optimere udtryk eller funktionskald. For eksempel, hvis du skulle prøve at søge efter datoer med en bestemt måned, kan du søge efter month(add_time) = 4 men det ville ikke bruge indekset på add_time, fordi datoerne med den måned er spredt gennem indekset, ikke alle grupperet sammen.

Du kender måske den date(add_time) burde kunne søges af indekset, men MySQL gør ikke den konklusion. MySQL ser bare, at du bruger en funktion, og den forsøger ikke engang at bruge indekset.

Det er derfor, MySQL 5.7 introducerede genererede kolonner for at give os mulighed for at indeksere et udtryk, og MySQL 8.0 gjorde det endnu bedre ved at tillade en indeks til at definere for et udtryk uden at vi skal definere en genereret kolonne først.



  1. Returner rækker, der indeholder ikke-alfanumeriske tegn i SQL Server

  2. Dvale generationsindeks og fremmednøgle med samme navn til MySQL

  3. Sådan henter du markørværdi med %ROWTYPE

  4. Cloud9 postgres