¡Guau! Esa es la "fusión de índices" más complicada que he visto.
Usualmente (quizás siempre ), puede crear un índice 'compuesto' para reemplazar un index-merge-intersect, y obtener un mejor rendimiento . Cambiar key2
de solo (pinned)
a (pinned, DeviceId)
. Este puede deshazte del 'intersect' y acelera.
En general, el optimizador utiliza la combinación de índices solo por desesperación. (Creo que esta es la respuesta a la pregunta del título). Cualquier cambio leve en la consulta o los valores involucrados, y el Optimizador realizará la consulta sin combinación de índice.
Una mejora en la tabla temporal __codes
es construir una tabla permanente con un amplio rango de valores, luego usar un rango de valores de esa tabla dentro de su Proc. Si está utilizando MariaDB, utilice la tabla de "secuencia" construida dinámicamente. Por ejemplo, la 'tabla' seq_1_to_100
es efectivamente una tabla de una columna con números 1..100. No es necesario declararlo ni completarlo.
Puedes deshacerte del otro REPEAT
bucle por computación la hora desde Code
.
Evitar LOOPs
será el mayor beneficio de rendimiento.
Haz todo eso, entonces puede que tenga otros consejos.