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

¿Por qué esta consulta INNER JOIN/ORDER BY mysql es tan lenta?

(Supongo que quiso escribir ids.customer_id = customer.customer_id y no customer_ids.customer_id)

Sin ORDER BY, mysql tomó los primeros 10 ID de tipo 10 (indexados), buscó al cliente y listo. (Tenga en cuenta que la UNIÓN IZQUIERDA aquí es realmente una UNIÓN INTERNA porque las condiciones de unión solo se mantendrán para las filas que coincidan en ambas tablas)

Con ORDER BY mysql probablemente esté recuperando todo type=10 clientes y luego ordenándolos por nombre para encontrar los primeros 10.

Puede acelerar esto desnormalizando la tabla de clientes (copiando el tipo en el registro del cliente) o creando una tabla de mapeo para contener el customer_id, name, type tuplas. En cualquier caso, agregue un índice en (type, name) . Si usa la tabla de mapeo, utilícela para hacer una unión de 3 vías con clientes e identificaciones.

Si type=10 es razonablemente común, también puede forzar la consulta para recorrer la tabla de clientes por nombre y comprobar el tipo de cada uno con STRAIGHT JOIN. No será tan rápido como un índice compuesto, pero será más rápido que obtener todas las coincidencias.

Y como se sugirió anteriormente, ejecute EXPLAIN en su consulta para ver el plan de consulta que está usando mysql.