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

Optimización de consultas de uso de índice MySQL

Algunas cosas... Tendría un índice compuesto ÚNICO en (a_id, job, state, start_time)

Esto para ayudar a optimizar la consulta en todos los criterios, en lo que creo que es la secuencia mejor ajustada. Un solo "A_ID", luego dos trabajos, un rango de estado pequeño, luego basado en el tiempo. A continuación, observe que no hay comillas... Parece que estaba convirtiendo comparaciones numéricas en cadenas, déjelas como numéricas para comparar, más rápido que las cadenas.

Además, al tenerlos a todos como parte del índice, es un índice de CUBIERTA, lo que significa que NO tiene que ir a los datos de la página sin procesar para obtener los otros valores para probar los registros de calificación para incluirlos o no.

SELECT 
      count(*) AS tries 
   FROM 
      tasks
   WHERE 
          a_id = 614
      AND job IN ( 1, 3 ) 
      AND state > 80 AND state < 100 
      AND start_time >= 1386538013;

Ahora, el por qué del índice... considere el siguiente escenario. Tienes dos salas que tienen cajas... En la primera sala, cada caja es un "a_id", dentro de eso están los trabajos en orden, dentro de cada trabajo están los rangos de estado y finalmente por hora de inicio.

En otra habitación, sus cajas se ordenan por hora de inicio, dentro de ese a_id se ordenan y finalmente se declaran.

Que sería más fácil encontrar lo que necesitas. Así es como se debe pensar en los índices. Preferiría ir a un cuadro para "A_ID =614", luego saltar al Trabajo 1 y otro para el Trabajo 3. Dentro de cada Trabajo 1, Trabajo 3, tome 80-100, luego tiempo. Sin embargo, conoce mejor sus datos y volumen en cada consideración de criterio y puede ajustar.

Finalmente, el conteo (ID) vs conteo (*). Todo lo que me importa es un récord calificado. No necesito saber el ID real ya que los criterios de filtrado ya están calificados como incluir o no, ¿por qué buscar (en este caso) el "ID" real?