Сблъсквал съм се с този проблем и преди. Ето моят анализ.
-
Среща се в MySQL 5.7 и 8.0, но очевидно не в по-стари версии и не в MariaDB.
-
"Решението", което предпочитам, е да променя индексите по следния начин:
INDEX(company_id) -- DROP this INDEX(company_id, id) -- ADD this
Въпреки че индексът с 2 колони е теоретично идентичен с индекса с една колона за InnoDB (приемайки id
е PK`), изглежда, че оптимизаторът игнорира този факт в някои ситуации .
Също така обичам изрично да добавям PK когато видя нужда . Това сигнализира на бъдещите читатели на схемата (включително мен), че някои заявки имат полза от добавянето на PK.
Все още не съм намерил случай, при който „пресечната точка при сливане на индекси“ е по-бърза от еквивалентен съставен индекс.
Не обичам някога да използвам индексни „подсказки“ от страх, че разпределението на данните ще се промени в бъдеще и моят „намек“ ще влоши нещата.