Náklady na údržbu indexu (jednosloupcového nebo vícesloupcového) téměř vždy převáží zlepšení výkonu při použití tohoto indexu. Je to malý přírůstek na každém INSERT /DELETE , plus náklady, pokud změníte hodnotu indexovaného pole pomocí UPDATE . (UPDATE případ je vzácný.) Nebojte se tedy nákladů na "udržování složeného indexu".
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
potřebuje INDEX(user_id, type) .
Optimalizátor bude
- zjistit, že tento index je možným kandidátem,
- potom zkontrolujte nějaké statistiky
- buď použijte index, nebo se rozhodněte, že mohutnost je nízká, a jednoduše naskenujte tabulku.
Zahrnout index; nedělejte si s tím starosti.
Pole jsem seřadil tímto způsobem, nikoli (type, user_id) na základě vašeho IN , což znamená, že někdy můžete mít více hodnot pro type .
Pokud všechny řádky v tabulce obsahují type = 'Car' , žádný problém. Vše, co jsem řekl, stále platí. Plýtvání zahrnutím zbytečného type je bezvýznamná.
Je lepší mít všechny sloupce „=“ nejprve v indexu, pak maximálně jedno další pole. Další diskuse zde .