sql >> Database >  >> RDS >> Mysql

MySQL-query is langzamer na het maken van de index

Is het realistisch om zoveel rijen te hebben met dezelfde price ? Is het realistisch om 444K rijen van een query te retourneren? Ik vraag deze omdat query-optimalisatie is gebaseerd op "normale" gegevens.

Een index (bijv. INDEX(price) ) is handig bij het zoeken naar een price dat komt een klein aantal keer voor. In feite schuwt de Optimizer de index als hij ziet dat de waarde waarnaar wordt gezocht meer dan ongeveer 20% van de tijd voorkomt. In plaats daarvan zou het gewoon de index negeren en doen wat je eerst hebt getest:gewoon de hele tabel scannen en alle rijen negeren die niet overeenkomen.

Je zou dat moeten kunnen zien door te doen

EXPLAIN select * from books where price = 10

met en zonder index. U kunt ook het volgende proberen:

EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10

Maar, ... Het lijkt erop dat de Optimizer de index niet negeerde. Ik zie dat de "kardinaliteit" van price is "1", wat inhoudt dat er slechts één afzonderlijke waarde in die kolom is. Deze 'statistiek' is onjuist of misleidend. Voer dit uit en kijk wat er verandert:

ANALYZE TABLE books;

Dit zal de statistieken herberekenen via een paar willekeurige sondes, en misschien verander die "1" in misschien "2".

Algemeen advies:pas op voor benchmarks die worden vergeleken met gefabriceerde gegevens.



  1. Hoe het aantal bits in een string in MySQL te krijgen - BIT_LENGTH()

  2. Recursie in Oracle

  3. TRUNC(datum) Functie in Oracle

  4. PostgreSQL:hoe te converteren van Unix-tijdperk tot nu toe?