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

¿Cómo optimizar esta consulta MySQL? millones de filas

Crearía los siguientes índices (índices de árbol b):

analytics(user_id, source, id) 
transactions(analytics, status)

Esto es diferente de la sugerencia de Gordon.

El orden de las columnas en el índice es importante.

Filtra por analytics.user_id específico , por lo que este campo debe ser el primero en el índice. Luego, agrupe por analytics.source . Para evitar ordenar por source este debería ser el siguiente campo del índice. También hace referencia a analytics.id , por lo que es mejor tener este campo como parte del índice, colóquelo al final. ¿MySQL es capaz de leer solo el índice y no tocar la tabla? No sé, pero es bastante fácil de probar.

Índice de transactions tiene que empezar con analytics , porque se usaría en JOIN . También necesitamos status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10