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

MySQL nie używa indeksów z klauzulą ​​WHERE IN?

Zobacz Jak MySQL używa indeksów .

Sprawdź również, czy MySQL nadal wykonuje pełne skanowanie tabeli po dodaniu dodatkowych 2000 lub więcej wierszy do user_metrics stół. W małych tabelach dostęp według indeksu jest w rzeczywistości droższy (z punktu widzenia operacji we/wy) niż skanowanie tabeli, a optymalizator MySQL może to wziąć pod uwagę.

W przeciwieństwie do mojego poprzedniego posta , okazuje się, że MySQL również używa optymalizatora opartego na kosztach , co jest bardzo dobrą wiadomością - to znaczy pod warunkiem, że uruchomisz swoją ANALYZE przynajmniej raz, gdy uważasz, że ilość danych w Twojej bazie danych jest reprezentatywna przyszłego codziennego użytku.

Kiedy masz do czynienia z optymalizatorami opartymi na kosztach (Oracle, Postgres itp.), musisz upewnić się, że okresowo uruchamiasz ANALYZE na różnych stołach, gdy ich rozmiar zwiększa się o ponad 10-15%. (Domyślnie Postgres zrobi to za Ciebie automatycznie, podczas gdy inne RDBMS pozostawi tę odpowiedzialność administratorowi baz danych, tj. Tobie). Poprzez analizę statystyczną ANALYZE pomoże optymalizatorowi lepiej zorientować się, ile I/O (i innych powiązanych zasobów, takich jak procesor, potrzebnych np. do sortowania) będzie zaangażowanych przy wyborze między różnymi kandydatami na plany wykonania. Nieudane uruchomienie ANALYZE może skutkować bardzo złymi, czasem katastrofalnymi decyzjami planistycznymi (np. milisekundowe zapytania zabierają czasem godziny z powodu złego zagnieżdżenia pętli na JOIN s.)

Jeśli wydajność jest nadal niezadowalająca po uruchomieniu ANALYZE , wtedy zazwyczaj będziesz w stanie obejść ten problem, korzystając ze wskazówek, np. FORCE INDEX , podczas gdy w innych przypadkach mogłeś natknąć się na błąd MySQL (np. ten starszy , co mogło cię ugryźć, gdybyś używał nested_set Railsów ).

Teraz, ponieważ jesteś w aplikacji Rails , będzie to kłopotliwe (i pokona cel ActiveRecord ) do wysyłania niestandardowych zapytań z podpowiedziami zamiast dalszego korzystania z ActiveRecord -generowane.

Wspomniałem o tym w naszej aplikacji Railsowej wszystkie SELECT zapytania spadły poniżej 100ms po przejściu na Postgres, podczas gdy niektóre złożone sprzężenia generowane przez ActiveRecord w przypadku MySQL 5.1 czasami zajęłoby to nawet 15 sekund lub więcej z powodu zagnieżdżonych pętli ze skanowaniem wewnętrznych tabel, nawet jeśli indeksy były dostępne. Żaden optymalizator nie jest doskonały i powinieneś zdawać sobie sprawę z dostępnych opcji. Inne potencjalne problemy z wydajnością, o których należy pamiętać, oprócz optymalizacji planu zapytań, to blokowanie. Jest to jednak poza zakresem Twojego problemu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przygotować zestawienie do zapytania aktualizacyjnego?

  2. Konwertuj BufferedInputStream na obraz

  3. Jak usunąć wiersz mysql po upływie czasu?

  4. Odmowa dostępu dla użytkownika 'root'@'localhost' (przy użyciu hasła:TAK) (Mysql::Błąd)

  5. Jak obliczyć miesięcznych aktywnych użytkowników (MAU) w MySQL?