2009-10-29 10 views
1

J'essaie d'obtenir des identifiants distincts sur une table de 6 millions de lignes. La requête est assez simple, et l'explication semble correcte. La ligne distict est indexée dans le cadre d'un index groupé de uid-date-heure.mysql distinct sur 6 millions de lignes prend 17 minutes pour fonctionner? Puis-je accélérer cela?

La requête est

SELECT DISTINCT uid FROM events;

et renvoie 334117 lignes de 17 min 15,54 secondes.

Explain est

 
+----+-------------+-------------+-------+---------------+----------------+---- 
----+------+------+--------------------------+ 
| 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 | 
+----+-------------+-------------+-------+---------------+----------------+---- 
----+------+------+--------------------------+ 

ce serait plus rapide si l'uid dans un lieu où l'indice séparé? ou existe-t-il un autre moyen d'accélérer cela?

+1

comment cet indice composite est-il défini? Si l'uid n'est pas la première partie, il est inutile – Javier

Répondre

2

Il ressemble à votre index par Date, puis UID qui n'aide pas. L'indexation par UID en premier ou ayant un index séparé pour l'UID améliorera grandement les performances. En outre, vous pouvez envisager using GROUP BY instead of DISTINCT.

+0

Merci G. Tout ce que j'avais lu précédemment en examinant ce problème (et mes tests sur GROUP BY avec un JOIN) me portent à croire que DISTINCT et GROUP BY étaient les mêmes, mais je viens de lancer la requête avec GROUP BY (non JOINS), et la requête i s maintenant 3,11 secondes. Assez rapidement pour mes scripts de maintenance. Merci – pedalpete

+0

Un index date + uid aide, un peu, car un tel index peut être scanné au lieu de la table principale, et donc nécessitant moins d'E/S. En outre, DISTINCT et GROUP BY, bien que liés, ne fournissent pas le même type de sortie. – mjv

+0

@mjv - Bon point. La numérisation de l'index est meilleure que l'analyse de la table. –

1

créer un index sur uid

2

Oui, avoir uid comme indice distinct peut être beaucoup plus rapide. Sans index, une analyse de table complète est requise. c'est-à-dire qu'il parcourt réellement chaque rangée et vérifie si l'uid spécifique est déjà sélectionné ou non. Cependant, avec un UID étant un index, il doit seulement traverser l'arbre de l'index, ce qui peut être beaucoup plus rapide s'il y a beaucoup d'UID en double.

0

Un index uid séparé accélérerait les choses. création de l'index serait probablement prendre cependant en e ordre de 17 minutes (depuis à peu près la même quantité de « lecture » doit être fait pour créer Teh index.

créant donc un tel indice tout dépend de l'utilisation prévue. Peut-être un bon "investissement" si les requêtes pertinentes sont lancées plusieurs fois (si ce n'est que pendant cette "campagne" actuelle de recherche d'enregistrements en double)

Questions connexes