2010-12-09 19 views
5

Estoy tratando de obtener el recuento de las encuestas que deben tomarse que se almacena en seotc, y el recuento de las encuestas completadas, almacenadas seotcresults_v2. La tabla seotc contiene casi 100k registros, y la tabla seotcresults_v2 contiene aproximadamente la mitad de eso. ¿Cómo puedo acelerar esta consulta?Acelere esta declaración de MySQL

SELECT 
    DISTINCT seotcresults_v2.Clock, 
    COUNT(seotc.Id) AS Surveys, 
    COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock 
WHERE seotcresults_v2.CampusID = 40 
AND seotcresults_v2.Term = 201011 
ORDER BY seotc.Clock 

ACTUALIZACIÓN:

Gracias por todas las respuestas. La estructura de la tabla (mínimamente) es la siguiente:

seotc: | Id | Reloj | CampusID | Término |

seotcresults_v2: | Id | Reloj | CampusID | Término | Q1 | Q2 | ... etc

Id es el índice de auto-incrementales en cada mesa para las encuestas y resultados de la encuesta

Dónde Clock 'es un ID de un instructor y pueden encontrarse varias veces en la tabla seotc y seotcresults_v2 porque tienen múltiples clases y múltiples encuestas completadas para cada clase por múltiples términos. Básicamente, estoy tratando de determinar la tasa de respuesta en función del número de encuestas para un instructor en un campus determinado en un plazo determinado en comparación con la cantidad de resultados publicados con esos mismos parámetros. ¿Eso ayuda?

Intentaré ejecutar EXPLAIN también en breve.

+1

Es posible que desee agregar la estructura de la tabla a su pregunta. –

+0

¿Qué índices ha definido en estas tablas? –

+1

También ejecute EXPLAIN en la consulta y pegue la salida. –

Respuesta

4

Lo primero que se debe comprobar: ¿están indexadas las columnas cláusula WHERE?

Entonces: ¿necesita el ORDER BY, que es un tipo, y costoso.

Finalmente, ¿las columnas .clock están indexadas?

+0

¿Qué quiere decir exactamente por indexado? Como en, "¿Están en su propia tabla con un id autoincrementado apropiado?" Si esa es la pregunta, entonces no, no lo son, pero el CampusID es único. ¿Es esto lo que quieres decir? No soy un DBA y lo que he aprendido ha sido autodidacta. Me encantaría aprender esto si tienes la paciencia para señalarme en la dirección correcta. – d2burke

+0

Un ID autoincrementado (secuencia, identidad, lo que sea-su-db-calls-it) no es un índice; es solo un campo de identificador único que se incrementa automáticamente en cada fila. Un índice es una entidad separada de la tabla; donde la tabla contiene los datos, un índice contiene solo los campos clave (a menudo hash) y un puntero en la tabla donde se pueden encontrar los datos asociados con esa clave. Normalmente, los campos de identidad (secuencia, autonumerador, etc.) tienen un índice creado automáticamente, que impone la singularidad. –

+0

Sin embargo, el RDBMS no creará automáticamente índices para otros campos; debe hacerlo usted mismo. Como regla general, cualquier campo que especifique en una cláusula WHERE, ORDER/GROUP BY o JOIN podría ser un candidato para tener un índice. Sin un índice, el RDBMS a menudo tiene que hacer un 'escaneo de tabla' de toda la tabla cada vez que necesita comparar dos campos, o un valor para un campo, y esto lleva mucho tiempo (más y más a medida que crece la tabla) . Un índice permite que el 'atajo' de RDBMS sea una exploración de tabla al tener una lista ordenada de claves (o valores) para escanear y comparar, y esto es mucho más rápido. –

0

No creo que esta consulta vaya a ofrecerle resultados correctos.

Agregue un índice a campusID y Término, y posiblemente reloj. Luego intente con esta consulta:

SELECT seotcresults_v2.Clock, 
     COUNT(seotc.Id) AS Surveys, 
     COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock 
WHERE seotcresults_v2.CampusID = 40 
AND seotcresults_v2.Term = 201011 
GROUP by seotcresults_v2.Clock 
ORDER BY seotcresults_v2.Clock 
Cuestiones relacionadas