Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie MySQL jest wolniejsze po utworzeniu indeksu

Czy realistyczne jest posiadanie tylu wierszy o tej samej price? ? Czy realistyczne jest zwrócenie 444 tys. wierszy z zapytania? Pytam o to, ponieważ optymalizacja zapytań opiera się na „normalnych” danych.

Indeks (np. INDEX(price) ) jest przydatne, gdy szukasz price zdarza się to kilka razy. W rzeczywistości Optymalizator omija indeks, jeśli widzi, że szukana wartość występuje w ponad 20% przypadków. Zamiast tego po prostu zignoruje indeks i wykona to, co najpierw przetestowałeś — po prostu przeskanuje całą tabelę, ignorując wszelkie niepasujące wiersze.

Powinieneś to zobaczyć, robiąc

EXPLAIN select * from books where price = 10

z indeksem i bez niego. Możesz też spróbować:

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

Ale... Wygląda na to, że Optymalizator nie zignorował indeksu. Widzę, że „liczność” price to „1”, co oznacza, że ​​w tej kolumnie jest tylko jedna odrębna wartość. Ta „statystyka” jest albo nieprawidłowa, albo myląca. Uruchom to i zobacz, jakie zmiany:

ANALYZE TABLE books;

Spowoduje to ponowne obliczenie statystyk za pomocą kilku losowych sond i może zmień „1” na „2”.

Porady ogólne:uważaj na testy porównawcze, które działają na sfabrykowanych danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uruchamianie wielu instrukcji SQL z Groovy

  2. Zmień kolejność wierszy w tabeli MySQL

  3. Utwórz nową bazę danych za pomocą MySQL Workbench

  4. Problemy z aktywnymi rekordami CodeIgnitera przy wywoływaniu wielu procedur składowanych

  5. Laravel 5.1 — Sprawdzanie połączenia z bazą danych