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

Indeks MySQL dla grupowania według / zamawiania według

To powinno ci pomóc. Przepisz zapytanie w następujący sposób:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)
AND c3 IS NOT NULL   
GROUP BY c1

Teraz utwórz indeks złożony dla kolumn (c4, c5, c6) z kolumnami W TEJ KOLEJNOŚCI. Kolumny w indeksie powinny pojawiać się w tej samej kolejności, co kolumny w klauzuli WHERE. W przeciwnym razie indeks nie będzie działał. Selektywność tego indeksu jest na tyle wąska, że ​​sortowanie plików w tabeli tymczasowej (dla grupowania według) powinno być szybkie.

Powód przeniesienia c3 na koniec zapytania jest następujący. Jako przykład załóżmy, że c3 może przyjmować wartości od 0 do 100 (lub może być NULL). Jeśli uruchomisz zapytanie "IS NOT NULL", Mysql musi przeszukać prawie cały indeks B-Tree z wyjątkiem krawędzi, które odpowiadają wartości NULL. Dlatego MySQL decyduje, że pełne skanowanie tabeli jest łatwiejszą opcją niż przechodzenie przez wszystkie różne ścieżki w indeksie. Z drugiej strony zobaczysz, że jeśli twoje zapytanie było "IS NULL", a twój indeks to (c3, c4, c5, c6), to Mysql faktycznie użyje tego indeksu. Dzieje się tak, ponieważ w tym przypadku Mysql musi przeszukać tylko część drzewa indeksów odpowiadającą wartości NULL.

Rodzaj indeksów, których potrzebuje MySQL, zależy w dużej mierze od zapytania. Tworzenie indeksów we wszystkich kolumnach, jak zasugerował @louis, NIE jest dobrym pomysłem!



  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 zainstalować phpMyAdmina

  2. Niezdefiniowany indeks:REMOTE_ADDR podczas migracji Laravel

  3. Uzyskaj ostatni odrębny zestaw rekordów

  4. Jak określić sortowanie z PDO bez SET NAMES?

  5. Jaki jest najbezpieczniejszy sposób dodania html/css/js do mysql?