sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué MySQL no siempre usa la combinación de índices aquí?

¡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.