Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi MySQL n'utilise-t-il pas toujours la fusion d'index ici ?

Ouah! C'est la "fusion d'index" la plus compliquée que j'ai vue.

Habituellement (peut-être toujours ), vous pouvez créer un index "composite" pour remplacer un index-merge-intersect, et être plus performant . Changer key2 à partir de seulement (pinned) à (pinned, DeviceId) . Cela peut débarrassez-vous de l'"intersection" et accélérez-la.

En général, l'optimiseur n'utilise la fusion d'index qu'en désespoir de cause. (Je pense que c'est la réponse à la question du titre.) Toute légère modification de la requête ou des valeurs impliquées, et l'optimiseur effectuera la requête sans fusion d'index.

Une amélioration sur la table temporaire __codes consiste à créer une table permanente avec une large plage de valeurs, puis à utiliser une plage de valeurs de cette table dans votre Proc. Si vous utilisez MariaDB, utilisez la table "séquence" construite dynamiquement. Par exemple le 'tableau' seq_1_to_100 est efficace un tableau d'une colonne avec les nombres 1..100. Pas besoin de le déclarer ou de le renseigner.

Vous pouvez vous débarrasser des autres REPEAT boucle par calcul l'heure de Code .

Éviter les LOOPs sera le plus grand avantage en termes de performances.

Faites tout cela, alors j'aurai peut-être d'autres conseils.