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

MySQL przestaje używać indeksu po dodaniu dodatkowych ograniczeń

Trochę trudno to wyjaśnić.

Kwerenda korzystająca z indeksu używa go, ponieważ indeks jest indeksem „pokrywającym”. Oznacza to, że w zapytaniu znajdują się wszystkie kolumny w indeksie. Jedyną częścią indeksu, która naprawdę jest używana efektywnie, jest warunek na latitude .

Normalnie indeks pokrycia miałby tylko kolumny wymienione w zapytaniu. Jednak klucz podstawowy jest używany do odwoływania się do rekordów, więc domyślam się, że users.Id jest kluczem podstawowym w tabeli. A indeks jest skanowany w poszukiwaniu poprawnych wartości latitude .

Kwerenda, która nie używa indeksu, nie używa go z dwóch powodów. Po pierwsze, warunki na kolumnach to nierówności. Wyszukiwanie indeksu może używać tylko warunków równości i jednej nierówności. Oznacza to, że indeks może być używany tylko dla latitude w swojej najskuteczniejszej metodzie. Po drugie, dodatkowe kolumny w zapytaniu i tak wymagają przejścia do strony danych.

Innymi słowy, optymalizator w efekcie mówi:„Po co zawracać sobie głowę przechodzeniem do indeksu w celu przeskanowania indeksu, a następnie skanowania stron danych? Zamiast tego mogę po prostu zeskanować strony danych i uzyskać wszystko na raz”.

Twoje następne pytanie to niewątpliwie:„Ale jak przyspieszyć moje zapytanie?” Proponuję zbadać indeksy przestrzenne .




  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 działa memcache z MySQL?

  2. Dodaj klucz obcy MySQL

  3. Minimalna odległość i grupuj według

  4. MySQL aktualizuje kolumnę daty dopuszczającej wartość null do wartości NULL

  5. Najłatwiejszy sposób na migrację projektu Django z MySQL do PostgreSQL