web-dev-qa-db-fra.com

Combien de lignes dans une base de données sont TROP MANY?

J'ai une table MySQL InnoDB avec 1 000 000 d'enregistrements. C'est trop? Ou les bases de données peuvent gérer cela et plus encore? Je demande parce que j'ai remarqué que certaines requêtes (par exemple, obtenir la dernière ligne d'une table) sont plus lentes (secondes) dans la table avec 1 millon de lignes que dans une avec 100.

80
Juanjo Conti

J'ai une table MySQL InnoDB avec 1000000 registres. C'est trop?

Non, 1 000 000 lignes (enregistrements AKA) n'est pas trop pour une base de données.

Je demande parce que j'ai remarqué que certaines requêtes (par exemple, obtenir le dernier registre d'une table) sont plus lentes (secondes) dans la table avec 1 million de registres que dans une avec 100.

Il y a beaucoup à expliquer dans cette déclaration. Les suspects habituels sont:

  1. Requête mal écrite
  2. Ne pas utiliser de clé primaire, en supposant qu'une existe même sur la table
  3. Modèle de données mal conçu (structure de table)
  4. Manque d'index
108
OMG Ponies

J'ai une base de données avec plus de 97 000 0 enregistrements (fichier de données de 30 Go), et je n'ai aucun problème.

N'oubliez pas de définir et d'améliorer votre table index.

Il est donc évident que 1 000 0 n'est pas BEAUCOUP! (Mais si vous n'indexez pas; oui, c'est BEAUCOUP)

59
amir beygi

Utilisez "expliquer" pour examiner votre requête et voir s'il y a un problème avec le plan de requête.

17

Je pense que c'est une idée fausse courante - la taille n'est qu'une partie de l'équation en ce qui concerne l'évolutivité de la base de données. Il y a d'autres problèmes qui sont difficiles (ou plus difficiles):

  • Quelle est la taille de l'ensemble de travail (c'est-à-dire combien de données doivent être chargées en mémoire et travaillées activement). Si vous insérez simplement des données et ne faites rien avec, c'est en fait un problème facile à résoudre.

  • Quel niveau de simultanéité est requis? Y a-t-il un seul utilisateur qui insère/lit, ou avons-nous plusieurs milliers de clients fonctionnant en même temps?

  • Quels niveaux de promesse/durabilité et cohérence des performances sont requis? Devons-nous nous assurer que nous pouvons honorer chaque engagement. Est-ce correct si la transaction moyenne est rapide, ou voulons-nous nous assurer que toutes les transactions sont rapides et fiables (contrôle qualité six sigma comme - http://www.mysqlperformanceblog.com/2010/06/07/ optimisation des performances et six-sigma / ).

  • Avez-vous besoin de résoudre des problèmes opérationnels, comme ALTER le schéma de table? Dans InnoDB, cela est possible, mais incroyablement lent car il doit souvent créer une table temporaire au premier plan (bloquer toutes les connexions).

Je vais donc dire que les deux problèmes limitatifs vont être:

  • Votre propre habileté à rédiger des requêtes/avoir de bons index.
  • Quelle douleur vous pouvez tolérer d'attendre sur les instructions ALTER TABLE.
11
Morgan Tocker

J'ai vu des tables non partitionnées avec plusieurs milliards d'enregistrements (indexés), qui se sont jointes pour le travail analytique. Nous avons finalement partitionné la chose, mais honnêtement, nous n'avons pas vu beaucoup de différence.

Cela dit, c'était dans Oracle et je n'ai pas testé ce volume de données dans MySQL. Les index sont votre ami :)

3
Jé Queue

Si vous voulez dire 1 million de lignes, cela dépend de la façon dont votre indexation est effectuée et de la configuration de votre matériel. Un million de lignes n'est pas une grande quantité pour une base de données d'entreprise, ni même une base de données de développement sur un équipement décent.

si vous voulez dire 1 million de colonnes (pas sûr que ce soit même possible dans MySQL) alors oui, cela semble un peu grand et causera probablement des problèmes.

3
GrayWizardx

Registre? Voulez-vous dire record?

Un million d'enregistrements n'est pas un gros problème pour une base de données de nos jours. Si vous rencontrez un problème, ce n'est probablement pas le système de base de données lui-même, mais plutôt le matériel sur lequel vous l'exécutez. Vous n'allez pas rencontrer de problème avec la base de données avant de manquer de matériel pour y jeter, très probablement.

Maintenant, de toute évidence, certaines requêtes sont plus lentes que d'autres, mais si deux requêtes très similaires s'exécutent à des moments très différents, vous devez déterminer quel est le plan d'exécution de la base de données et l'optimiser, c'est-à-dire utiliser des index corrects, une normalisation appropriée, etc.

Soit dit en passant, il n'existe pas de "dernier" enregistrement dans une table, d'un point de vue logique, ils n'ont pas d'ordre inhérent.

3
phoebus

En supposant que vous voulez dire "enregistrements" par "registres" non, ce n'est pas trop, MySQL évolue très bien et peut contenir autant d'enregistrements que vous avez d'espace sur votre disque dur.

De toute évidence, les requêtes de recherche seront plus lentes. Il n'y a vraiment aucun moyen de contourner cela, sauf pour vous assurer que les champs sont correctement indexés.

2
Thomas Bonini

L'utilisation de la requête fournie sera exceptionnellement lente en raison de l'utilisation d'une méthode de fusion de tri pour trier les données.

Je recommanderais de repenser la conception afin que vous utilisiez des index pour la récupérer ou assurez-vous qu'elle est déjà ordonnée de cette manière afin qu'aucun tri ne soit nécessaire.

0
Louis

Plus la table est grande (comme dans plus de lignes), plus les requêtes seront lentes s'il n'y a pas d'index. Une fois que vous avez ajouté les bons index, les performances de votre requête devraient s'améliorer ou du moins ne pas se dégrader au fur et à mesure que la table grandit. Cependant, si la requête elle-même renvoie plus de lignes à mesure que la table s'agrandit, vous commencerez à voir à nouveau la dégradation.

Bien que 1M de lignes ne soient pas si nombreuses, cela dépend également de la quantité de mémoire dont vous disposez sur le serveur de base de données. Si la table est trop grande pour être mise en mémoire cache par le serveur, les requêtes seront plus lentes.

0
jvilalta