2012-04-23 23 views
8

MySQL que tiene la consulta SQL folowwinggrupo por muy lento

SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

La consulta se ejecuta más de 11400000 filas y funciona muy lento. Tarda más de 3 minutos en ejecutarse. Si elimino la parte grupal, esto se ejecuta por debajo de 1 segundo. ¿Porqué es eso?

versión de MySQL Server es '5.0.21-comunidad-nt'

Here is the table schema: 
CREATE TABLE `sales` (
    `ID` int(11) NOT NULL auto_increment, 
    `DocNo` int(11) default '0', 
    `CustomerID` int(11) default '0', 
    `OperatorID` int(11) default '0', 
    PRIMARY KEY (`ID`), 
    KEY `ID` (`ID`), 
    KEY `DocNo` (`DocNo`), 
    KEY `CustomerID` (`CustomerID`), 
    KEY `Date` (`Date`) 
) ENGINE=MyISAM AUTO_INCREMENT=14946509 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
+1

puede publicar el esquema de la tabla (crear el script de la tabla) –

+2

No estoy seguro de si ha publicado la consulta real o no. Pero en esta consulta, ¿cuál sería la necesidad de 'GROUP BY' si no hay funciones de agrupación? –

+0

Aziz, necesito devolver los valores únicos de customerID – Treach

Respuesta

17

Trate de poner un índice en (Fecha, CustomerID).

Tenga una mirada en el manual de MySQL para el grupo de optimización de consultas: - Group by optimization

puede averiguar cómo MySQL está generando el resultado si se utiliza EXPLAIN de la siguiente manera: -

EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

Esta voluntad le dirá qué índices (si los hay) mysql está utilizando para optimizar la consulta. Esto es muy útil al aprender qué índices funcionan para qué consultas, puede intentar crear un índice y ver si mysql lo usa. Entonces, incluso si no comprende completamente cómo mysql calcula las consultas agregadas, puede crear un índice útil por prueba y error.

+1

Como alguien que está comenzando a dominar las consultas y las tablas, esta pequeña pepita fue invaluable. Gracias. –

+0

@ArthurGoldsmith No se preocupe :) – rgvcorley

0

¿No sería mucho más rápido y lograría lo mismo?

SELECT DISTINCT CustomerID FROM sales WHERE `Date` <= '2012-01-01' 

Asegúrese de colocar un índice en Date, por supuesto. No estoy del todo seguro, pero indexar CustomerID también podría ayudar.

3

Sin saber cómo es el esquema de la tabla, es difícil estar seguro, pero probablemente sería útil si agregó un índice de varias columnas en Date y CustomerID. Eso le ahorraría a MySQL la molestia de hacer una exploración de tabla completa para la declaración GROUP BY. Por lo tanto, intente ALTER TABLE sales ADD INDEX (Date,CustomerID).

1

probar esto:

SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01' 
+1

en mysql distinct es solo un caso especial de un grupo por http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html – cproinger

1

que tenían el mismo problema, he cambiado los campos clave a la misma intercalación y que solucione el problema. Los campos para unir las tablas tenían diferente valor Intercalado.