J'ai déjà rencontré ce problème. Voici mon analyse.
-
Cela se produit dans MySQL 5.7 et 8.0, mais apparemment pas dans les anciennes versions et pas dans MariaDB.
-
La "solution" que je préfère est de changer les index ainsi :
INDEX(company_id) -- DROP this INDEX(company_id, id) -- ADD this
Bien que l'index à 2 colonnes soit théoriquement identique à l'index à une colonne pour InnoDB (en supposant que id
est le PK`), l'optimiseur semble ignorer ce fait dans certaines situations .
De plus, j'aime ajouter explicitement le PK lorsque je vois un besoin . Cela signale aux futurs lecteurs du schéma (y compris moi-même) que certaines requêtes bénéficient de l'ajout de la PK.
Je n'ai pas encore trouvé de cas où "l'intersection de fusion d'index" est plus rapide qu'un index composite équivalent.
Je n'aime jamais utiliser des "indices" d'index de peur que la distribution des données ne change à l'avenir et que mon "indice" n'aggrave les choses.