Er det realistisk at have så mange rækker med samme price
? Er det realistisk at returnere 444K rækker fra en forespørgsel? Jeg spørger disse, fordi forespørgselsoptimering er baseret på "normale" data.
Et indeks (f.eks. INDEX(price)
) er nyttig, når du leder efter en price
der forekommer et lille antal gange. Faktisk skyr Optimizer indekset, hvis den ser, at den værdi, der søges efter, forekommer mere end omkring 20 % af tiden. I stedet ville den blot ignorere indekset og gøre, hvad du testede først - blot scanne hele tabellen og ignorere alle rækker, der ikke matcher.
Det burde du kunne se ved at gøre
EXPLAIN select * from books where price = 10
med og uden indeks. Alternativt kan du prøve:
EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10
Men ... Det ser ud til, at Optimizer ikke ignorerede indekset. Jeg kan se, at "kardinaliteten" af price
er "1", hvilket betyder, at der kun er én særskilt værdi i den kolonne. Denne 'statistik' er enten forkert eller vildledende. Kør dette og se, hvad der ændres:
ANALYZE TABLE books;
Dette vil genberegne statistikken via et par tilfældige sonder, og kan ændre det "1" til måske "2".
Generelle råd:Pas på benchmarks, der kører mod fabrikerede data.