2011-10-07 20 views
5

tengo la siguiente consulta:MySQL Query mejorar el rendimiento

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) 
    FROM forwarding 
    WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY fDate 

Explicar me da el siguiente resultado:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE forwarding index fDate,fDate_2 fDate_2 3  1481127 Using where 

Se puede ver que hay una gran cantidad de datos. El tiempo total de trabajo es de 12 segundos. ¿Cómo puedo mejorar el rendimiento? No sé lo que puedo hacer más como establecer el índice.

Hay mis índices para esta tabla:

fDate (fDate, f_shop) 
fDate2(dDate), 
f_shop(f_shop) 

Gracias por su ayuda.

ACTUALIZACIÓN:

Ahora he añadido una columna en mi cláusula where y la consulta es mucho más lento que antes.

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) FROM forwarding 
WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" AND f_shop=10077 GROUP BY fDate 

Tengo un índice en forwardDate y f_shop pero el rendimiento es lento. ¿Cuál es la solución perfecta? Gracias

+0

Pruebe un índice '(fDate, cid)'. –

+0

Y si 'sid' no puede ser' NULL', use 'COUNT (*)' en lugar de 'COUNT (sid)' –

+0

Y una pregunta: ¿es 'fDate' del tipo' DATE' o de 'DATETIME'? –

Respuesta

3

Además de ypercube de respuesta que ofrece, su consulta en la que está buscando una tienda específica ... Yo tendría un índice en

(f_shop, FDATE, cid) para asegurar las 3 partes de el índice se utilizan con el más pequeño DONDE calificador cláusula delante .. en su última muestra, que ha incluido el interés en una tienda específica ...

SELECT 
     COUNT(sid), 
     fDate, 
     COUNT(DISTINCT(cid)) 
    FROM 
     forwarding 
    WHERE 
      f_shop=10077 
     AND fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY 
     fDate 
+0

sí, muchas gracias. ¿Es la orden importante para el índice? ¿Cómo podría saber que fDate y f_shop no son suficientes? – user954740

+1

@ user954740, sí, el orden es importante y debe estar en orden de la pieza más granular que está tratando de encontrar en función de las consultas comunes. En este caso, asumiría F_SHOP porque podría tener más de 100 entradas de F_SHOP.Por lo tanto, primero escanee por rango de fechas, saltee todas las demás "tiendas". Al tener eso en la primera posición, COMIENZA con la tienda única, y luego dentro de eso, solo con el rango de fechas que le preocupan. – DRapp

Cuestiones relacionadas