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

MySQL-forespørgsel er langsommere efter oprettelse af indeks

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.



  1. MongoDB Basics:Konfiguration af rollebaseret adgangskontrol (RBAC)

  2. CodeIgniter liste-felter

  3. Hvordan beregner jeg et glidende gennemsnit ved hjælp af MySQL?

  4. Betinget mySQL-erklæring. Hvis sand OPDATERING, hvis falsk INDSÆT