Koszt utrzymania indeksu (jednokolumnowego lub wielokolumnowego) prawie zawsze jest równoważony przez poprawę wydajności, gdy ten indeks jest używany. Jest to mały przyrost na każdym INSERT
/DELETE
, plus koszt w przypadku zmiany wartości indeksowanego pola za pomocą UPDATE
. (UPDATE
przypadek jest rzadki.) Więc nie martw się o koszt "utrzymywania indeksu złożonego".
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
potrzebuje INDEX(user_id, type)
.
Optymalizator
- odkryj, że ten indeks jest możliwym kandydatem,
- sprawdź statystyki, a następnie
- albo użyj indeksu, albo zdecyduj, że kardynalność jest słaba i po prostu zeskanuj tabelę.
Dołącz indeks; nie martw się o to.
Uporządkowałem pola w ten sposób, a nie (type, user_id)
na podstawie Twojego IN
, co oznacza, że czasami możesz mieć wiele wartości dla type
.
Jeśli wszystkie wiersze w tabeli mają type = 'Car'
, bez problemu. Wszystko, co powiedziałem, nadal obowiązuje. Marnotrawstwo dołączania niepotrzebnego type
jest nieistotne.
Lepiej jest mieć wszystkie kolumny „=” najpierw w indeksie, a następnie co najwyżej jedno inne pole. Dalsza dyskusja tutaj .