2011-11-13 4 views
0

J'ai une table de base de données avec 10 000 000+ lignes que je traite pour créer une nouvelle table. Quel est le meilleur type de moteur de stockage pour la lecture?Meilleur moteur de stockage pour base de données avec 10 000 000 lignes

Actuellement j'utilise:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '0';"; 

ensuite pour sélectionner les enregistrements:

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

Je collectionne la clé primaire id dans un tableau appelé ids $ et je traite les dossiers et écrire les données un fichier CSV à importer à la fin de chaque 1000 lignes. mettre à jour puis le champ acv_return_viadetails avec:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '1' WHERE `id` IN ('".implode("','",$ids)."') LIMIT 1000;"; 

Comme ci-dessus est la seule écriture à la table et je sélectionner tous les champs à chaque fois. Dois-je utiliser une table de mémoire ou un autre type de moteur de stockage pour accélérer les choses? Ou y a-t-il d'autres optimisations que je pourrais introduire pour accélérer les choses?

Aussi ce qui serait une configuration my.cnf raisonnable pour une telle opération.

Merci à l'avance :)

+1

Si vous cherchez des techniques avancées dans le réglage de votre configuration MySQL Je recommande fortement http://www.mysqlperformanceblog.com/pour déterminer tous les réglages que vous pouvez faire. Vous ne pouvez pas voir pourquoi vous ne pouvez pas utiliser 'InnoDb' et vous assurer que' acv_return_viadetails' a un 'INDEX'. Peut-être que si nous en savions un peu plus sur votre jeu de données, il serait logique de le décomposer en tables plus petites ou de réorganiser les données. –

+0

Merci, je vais essayer Innodb mais je ne peux pas vraiment diviser les données parce que c'est une importation CSV directe en utilisant LOAD DATA INFILE - environ 90 champs * 10M lignes. –

+0

innodb - clés primaires groupées voir ici http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choisir-la-right-one-on-a/4421601#4421601 –

Répondre

0

Quelques suggestions:

1) Remplacer

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

avec

$sql = "SELECT `id` FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

2) Vérifiez s'il est possible de charger tous les ids à la fois sans la limite 1000. Avec 10M enregistrements, il ne devrait prendre que quelques centaines de Mo pour charger tous les ids.

$sql = "SELECT `id` FROM `packages_unsorted`"; 

Si ce n'est pas le cas, envisagez d'augmenter la limite.

3) Vous pouvez essayer quelque chose comme ce qui suit au lieu d'utiliser acv_return_viadetails:

$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 0, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 1000, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 2000, 1000;"; 
+0

Merci, je comprends, mais j'ai besoin de tous les champs de la table à traiter, donc je dois sélectionner * à chaque fois. J'ai aussi besoin de chunk (par 1000) pour qu'il libère le serveur mysql pour les requêtes sur d'autres tables donc je ne peux pas saisir tous les ids :( –

+0

Peut-être que vous pourriez juste sélectionner le 'id', les stocker dans une liste PHP et Je les traiterai un par un, je crois que saisir tous les identifiants ne devrait pas prendre trop de ressources. – nikhil500

1

Avez-vous un index sur le champ acv_return_viadetails?

Si vous cherchez à accélérer l'importation, je viens de créer un programme en C++ pour importer un fichier de 300 Mo dans mysql en 65s. Peut-être que vous pouvez l'adapter pour votre usage.

Voir https://github.com/homer6/import-geoip-data

+0

+1 pour le partage. Pouvez-vous me dire ce que < and > en C++ signifie: std :: auto_ptr temp_connection? – Bytemain

+0

C'est un modèle. Cela vous permet de créer plusieurs types de classes. Par exemple, le vecteur crée un vecteur (qui est une collection) d'ints. Alors que le vecteur crée un vecteur de chaînes. Dans le cas que vous avez mentionné, il crée un auto_ptr à un sql :: Connection – Homer6

+0

Oui j'ai un index sur 'acv_return_viadetails' mais j'ai seulement accès à PHP sur le serveur donc je ne peux pas utiliser l'application C++. Je vais l'utiliser pour d'autres choses cependant :) –

Questions connexes