J'ai un programme C qui extrait une énorme source de données (20GB de texte brut) et génère des charges d'INSERT à exécuter sur une table vide simple (4 colonnes entières avec 1 clé primaire). Configuration en tant que table MEMORY
, l'ensemble de la tâche se termine en 8 heures. Après la finition, environ 150 millions de lignes existent dans la table. Huit heures est un nombre complètement décent pour moi. C'est un accord unique. Le problème survient lorsque vous tentez de convertir la table MEMORY
en MyISAM
pour que (A) la mémoire soit libérée pour les autres processus et (B) les données ne seront pas supprimées lorsque je redémarrerai l'ordinateur.Génération d'une énorme table MySQL 150M-row
ALTER TABLE memtable ENGINE = MyISAM
J'ai laissé cette requête exécutée ALTER TABLE
pendant plus de deux jours déjà, et il ne se fait pas. Je l'ai maintenant tué.
Si je crée la table initialement en tant que MyISAM, la vitesse d'écriture semble terriblement mauvaise (en particulier du fait que la requête nécessite l'utilisation de la technique ON DUPLICATE KEY UPDATE
). Je ne peux pas désactiver temporairement les touches. La table deviendrait plus de 1000 fois plus grande si je le devais et ensuite je devrais retraiter les clés et exécuter un GROUP BY sur 150 000 000 000 lignes. Umm, non.
L'une des principales contraintes à réaliser: La requête INSERT UPDATEs enregistre si la clé primaire (un hachage) existe déjà dans la table. Au tout début d'une tentative d'utilisation stricte de MyISAM, j'obtiens une vitesse approximative de 1 250 lignes par seconde. Une fois que l'indice augmente, j'imagine que ce taux sera encore plus important.
J'ai 16 Go de mémoire installée dans la machine. Quelle est la meilleure façon de générer une table massive qui finit par être une table MyISAM indexée sur disque?
Précision: Il y a beaucoup, beaucoup de UPDATEs en cours de la requête (INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever
). Ce n'est pas, en aucun cas, un problème de décharge brute. Mon raisonnement pour essayer une table MEMORY
en premier lieu était pour accélérer toutes les recherches d'index et les changements de table qui se produisent pour chaque INSERT.
InnoDB serait bien. C'est très intelligent ... J'aime ça. Merci de m'avoir fait des commentaires. Je vous en suis reconnaissant. :) – brianreavis