2008-11-04 14 views
6

Mam zapytanie na mojej bazy danych jako takie:Wykonywanie wielu kolumn indeksów MySQL przy użyciu tylko jednej kolumny w zapytaniu

SELECT * FROM expenses WHERE user_id = ? AND dated_on = ? 

Dodałem indeks w tabeli na obu user_id i dated_on kolumnach . Kiedy sprawdzać indeksy za pomocą SHOW INDEXES FROM expenses, istnieją dwie linie - jedna o wartości seq_in_index 1, drugi o wartości seq_in_index z 2.

Moje pytanie brzmi, czy mogę następnie złożyć zapytanie który wykorzystuje tylko jeden dwa WHERE, np:

SELECT * FROM expenses WHERE user_id = ? 

Czy jest jakaś korzyść dla tworzenia innego indeksu, który wyłącznie indeksy kolumna user_id, albo indeks user_id/dated_on opisane powyżej stosować równie skutecznie?

Wreszcie, jak o tym, czy należy użyć zapytania:

SELECT * FROM expenses WHERE dated_on = ? 

jaki sposób wartość seq_in_index z 2 wpłynąć użycie indeksu i wydajność w tej sytuacji?

Odpowiedz

8

MySQL może używać any left portion of an index.

W twoim przykładzie SELECT * FROM expenses WHERE user_id = ? użyje indeksu, ale SELECT * FROM expenses WHERE dated_on = ? nie będzie.

Dla indeksu 3-kolumny A, B, C, WHERE A = ? AND B = ? użyje indeksu nad A i B, ale WHERE A = ? AND C = ? użyje tylko indeks na

5

Jeśli Twój indeks na id_użytkownika i dated_on jest naprawdę w tej kolejności (najpierw identyfikator użytkownika), to będzie również używany dla zapytania user_id. Możesz sprawdzić, używając EXPLAIN, aby zobaczyć rzeczywistą strategię dla zapytania.

+1

jestem naprawdę zainteresowany, aby wiedzieć, w jaki sposób zmiany wartości seq_in_index wydajność kwerendy, więc odpowiednio zredagowałem pytanie – Olly

Powiązane problemy