sql >> Databasteknik >  >> RDS >> Mysql

MySQL-frågan är långsammare efter att index skapats

Är det realistiskt att ha så många rader med samma price ? Är det realistiskt att returnera 444K rader från en fråga? Jag frågar dessa eftersom frågeoptimering baseras på "normala" data.

Ett index (t.ex. INDEX(price) ) är användbart när du letar efter ett price som inträffar ett litet antal gånger. Faktum är att Optimizern skyr indexet om den ser att värdet som söks efter inträffar mer än cirka 20 % av tiden. Istället skulle den helt enkelt ignorera indexet och göra det du testade först – helt enkelt skanna hela tabellen och ignorera alla rader som inte matchar.

Du borde kunna se det genom att göra

EXPLAIN select * from books where price = 10

med och utan index. Alternativt kan du prova:

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 verkar som om Optimizern inte ignorerade indexet. Jag ser att "kardinalitet" av price är "1", vilket innebär att det bara finns ett distinkt värde i den kolumnen. Denna "statistik" är antingen felaktig eller missvisande. Kör detta och se vad som ändras:

ANALYZE TABLE books;

Detta kommer att räkna om statistiken via några slumpmässiga sonder, och kan ändra den "1" till kanske "2".

Allmänna råd:Se upp för riktmärken som körs mot tillverkade data.



  1. Använder Intel Optane Storage för SQL Server

  2. Vänster JOIN snabbare eller Inner Join snabbare?

  3. SCHEMA() Funktion i MySQL

  4. Implementering av fulltextsökning i SQL Server 2016 för nybörjare