8 votes

Diviser une grande table mySql en plusieurs plus petites - en vaut-il la peine?

J'ai environ 28 millions d'enregistrements à importer dans une base de données mySql. L'enregistrement contient des informations personnelles sur des membres aux États-Unis et sera consultable par États.

Ma question est la suivante : est-il plus efficace de diviser la table en tables plus petites plutôt que de tout conserver dans une seule grande table ? Ce que j'avais en tête était de les diviser en 50 tables séparées représentant les 50 états comme ceci : membres_CA, membres_AZ, membres_TX, etc;

De cette façon, je pourrais faire une requête comme celle-ci :

'SELECT * FROM membres_' . $_POST['state'] . ' WHERE nom_membre LIKE "John Doe" ';

De cette façon, je n'aurais à traiter les données que pour un état donné à la fois. Intuitivement, cela semble très logique, mais je serais curieux d'entendre d'autres opinions.

Merci d'avance.

16voto

Michael J.V. Points 3137

J'ai posté initialement en tant que commentaire mais je vais le poster en tant que réponse maintenant.

Ne pensez jamais à créer X tables en fonction d'une différence d'attribut. Ce n'est pas comme ça que les choses se font.

Si votre table aura 28 millions de lignes, pensez à la partitionner pour la diviser en ensembles logiques plus petits.

Vous pouvez lire sur la partition à la documentation MySQL.

L'autre chose est de choisir le bon design de base de données et de choisir correctement vos index.

La troisième chose serait d'éviter l'horrible idée d'utiliser $_POST directement dans votre requête, car vous ne voudriez probablement pas qu'une personne injecte du SQL et supprime votre base de données, tables ou autres.

La dernière chose est de choisir le matériel approprié pour la tâche, vous ne voulez pas qu'une telle application s'exécute sur un VPS avec 500 Mo de RAM ou 1 Go de RAM.

2voto

Jayesh Points 897

Ne faites pas cela. Gardez les données similaires dans une seule table. Vous aurez de gros problèmes lors de la prise de décisions logiques et de la création de requêtes lorsque la décision concerne de nombreux états. De plus, si vous devez modifier la définition de la base de données en ajoutant des colonnes, vous devrez effectuer la même opération sur toutes les nombreuses (apparemment infinies) tables.

Utilisez l'indexation pour augmenter les performances mais restez sur une seule table !!!

Vous pouvez également augmenter le cache mémoire pour améliorer les performances. Suivez cet article pour le faire.

1voto

phlogratos Points 3424

Si vous créez un index sur la colonne d'état un select sur tous les membres d'un état sera aussi efficace que l'utilisation de tables séparées. Diviser la table a beaucoup d'inconvénients. Si vous ajoutez des colonnes vous devez les ajouter dans 50 tables. Si vous voulez des données de différents états vous devez utiliser des déclarations union qui seront très laides et inefficaces. Je recommande vivement de rester sur une seule table.

0voto

Yurii Rochniak Points 116

Ma première réponse est que vous devez garder toutes les données similaires ensemble et les conserver dans une seule table. Vous devriez envisager de mettre des index sur votre table pour améliorer les performances, mais sans la diviser en plusieurs tables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X