¿MySQL distinto en 6 millones de filas tarda 17 minutos en ejecutarse? ¿Puedo acelerar esto?

StackOverflow https://stackoverflow.com/questions/1645523

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de obtener identificaciones distintas de una tabla de 6 millones de filas. La consulta es bastante simple, y la explicación parece estar bien. La fila distintiva se indexa como parte de un índice agrupado de uid-date-time.

La consulta es

SELECT DISTINCT uid FROM events;

y devuelve 334117 filas en 17 minutos y 15,54 segundos.

La explicación es

+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+
| id | select_type | table       | type  | possible_keys | key            | keylen | ref  | rows | Extra                    |
+----+-------------+-------------+-------+---------------+----------------+--------+------+------+--------------------------+
|  1 | SIMPLE      | events     | range | NULL          | dateuid_idx      | 4     | NULL |   10 | Using index for group-by |
+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+

¿sería esto más rápido si el uid se mantuviera en un índice separado? o hay otra forma de acelerar esto?

¿Fue útil?

Solución

Parece su índice por Fecha y luego UID que no ayuda. La indexación por UID primero o tener un índice separado para UID mejorará enormemente el rendimiento.

Además, puede considerar usando GROUP BY en lugar de DISTINCT .

Otros consejos

Sí, tener uid como índice separado puede ser mucho más rápido. Sin un índice se requiere una exploración de tabla completa; es decir, en realidad itera por cada fila y comprueba si el uid específico ya está seleccionado o no.

Sin embargo, con un uid como índice, solo tiene que atravesar el árbol de índice, que puede ser mucho más rápido si hay muchos uid duplicados.

crear un índice en uid

Un índice uid separado aceleraría las cosas. Sin embargo, crear el índice probablemente tomaría unos 17 minutos (ya que se debe realizar aproximadamente la misma "lectura" para crear el índice.

Por lo tanto, la creación de dicho índice depende del uso esperado. Puede ser una buena "inversión" si las consultas relevantes se ejecutan varias veces (aunque solo sea durante esta " campaña " de búsqueda de registros duplicados).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top