S tímto problémem jsem se již setkal. Zde je moje analýza.
-
Vyskytuje se v MySQL 5.7 a 8.0, ale zjevně ne ve starších verzích a ne v MariaDB.
-
"Řešení", které preferuji, je změnit indexy takto:
INDEX(company_id) -- DROP this INDEX(company_id, id) -- ADD this
Ačkoli je 2sloupcový index teoreticky totožný s jednosloupcovým indexem pro InnoDB (za předpokladu id
je PK`), zdá se, že Optimizer tuto skutečnost ignoruje v některých situacích .
Také bych rád explicitně přidal PK, když vidím potřebu . To signalizuje budoucím čtenářům schématu (včetně mě), že některý dotaz těží z připojení PK.
Ještě jsem nenašel případ, kdy by "index merge intersect" bylo rychlejší než ekvivalentní složený index.
Nerad používám indexové „nápovědy“ ze strachu, že se distribuce dat v budoucnu změní a moje „nápověda“ situaci zhorší.