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 .