2012-04-12 5 views
5

Il y a environ 2 mois, j'ai importé des données EnWikipedia (http://dumps.wikimedia.org/enwiki/20120211/) dans mysql. Après avoir terminé l'importation des données EnWikipedia, j'ai créé l'index dans les tables de la base de données EnWikipedia dans mysql pendant environ 2 mois.Créer un index prend trop de temps

Maintenant, j'ai atteint le point de créer l'index dans "pagelinks".

Cependant, il semble prendre un temps infini pour passer ce point.

Par conséquent, j'ai vérifié le temps restant à passer pour m'assurer que mon intuition était correcte ou non.

En conséquence, le temps restant attendu était de 60 jours (en supposant que je crée l'index dans "pagelinks" depuis le début.)

My EnWikipedia database has 7 tables: 
"categorylinks"(records: 60 mil, size: 23.5 GiB), 
"langlinks"(records: 15 mil, size: 1.5 GiB), 
"page"(records: 26 mil, size 4.9 GiB), 
"pagelinks"(records: 630 mil, size: 56.4 GiB), 
"redirect"(records: 6 mil, size: 327.8 MiB), 
"revision"(records: 26 mil, size: 4.6 GiB) and "text"(records: 26 mil, size: 60.8 GiB). 

Mon serveur est ... version Linux 2.6.32 -5-amd64 (Debian 2.6.32-39), mémoire 16Go, 2.39Ghz Intel 4 core

Est-ce un phénomène courant pour créer un index si long? Est-ce que quelqu'un a une bonne solution pour créer un index plus rapidement?

Merci d'avance!


P.S: J'ai effectué les opérations suivantes pour vérifier le temps restant.

Références (Désolé, la page suivante est écrit en japonais): http://d.hatena.ne.jp/sh2/20110615

1er. J'ai des enregistrements dans "pagelink".

mysql> select count(*) from pagelinks; 
+-----------+ 
| count(*) | 
+-----------+ 
| 632047759 | 
+-----------+ 
1 row in set (1 hour 25 min 26.18 sec) 

2. J'ai obtenu le nombre d'enregistrements augmentés par minute.

getHandler_write.sh

#!/bin/bash 

while true 
do 
    cat <<_EOF_ 
SHOW GLOBAL STATUS LIKE 'Handler_write'; 
_EOF_ 
    sleep 60 
done | mysql -u root -p -N 

commande

$ sh getHandler_write.sh 
Enter password: 
Handler_write 1289808074 
Handler_write 1289814597 
Handler_write 1289822748 
Handler_write 1289829789 
Handler_write 1289836322 
Handler_write 1289844916 
Handler_write 1289852226 

3. J'ai calculé la vitesse d'enregistrement.

Selon le résultat de 2., la vitesse d'enregistrement est

7233 records/minutes 

4. Ensuite, le temps restant est

(632047759/7233)/60/24 = 60 days 
+0

: //stackoverflow.com/questions/2167522/innodb-takes-over-an-hour-to-import-600mb-file-myisam-in-a-few-minutes – SunKing2

+3

Maintenant c'est ce que j'appelle de la patience Respect – fancyPants

Répondre

6

Ce sont des tables assez grandes, donc j'attendre l'indexation d'être assez lent. 630 millions d'enregistrements représentent BEAUCOUP de données à indexer. Une chose à considérer est le partitionnement, avec des ensembles de données aussi grands, sans tables correctement partitionnées, les performances seront ralenties.Voici quelques liens utiles: using partioning on slow indexes vous pouvez également essayer de regarder les paramètres de taille de mémoire tampon pour construire les index (la valeur par défaut est 8MB, faire pour votre grande table qui va vous ralentir un peu juste.)

+0

Thank pour vos conseils, je vais revoir mes paramètres. –