Combien de lignes d'une base de données y a-t-il TROP?

87

J'ai une table MySQL InnoDB avec 1 000 000 enregistrements. Est-ce 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 million de lignes que dans une avec 100.

Juanjo Conti
la source

Réponses:

114

J'ai une table MySQL InnoDB avec 1000000 registres. Est-ce trop?

Non, 1 000 000 lignes (enregistrements AKA), ce 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'il en existe même une sur la table
  3. Modèle de données mal conçu (structure de table)
  4. Manque d'index
Poneys OMG
la source
4
5. Spécifications du serveur obsolètes <Dernier recours.
Sneakyness
19
@Brimstedt: J'ai toujours pensé que le nom devait être "Indices", mais je ne pense pas avoir jamais vu quelqu'un l'utiliser pour des bases de données: de Wikipedia: en.wikipedia.org/w/ ... à Mr. Coding Horror: codinghorror. com / blog / archives / 000638.html . Il y a ce post SO intéressant sur le sujet: stackoverflow.com/questions/1001366 .
Daniel Vassallo
7
6. pas assez de mémoire allouée pour les différents caches d'innodb
Jason
pour de meilleures performances si je dois utiliser PrimaryKey? Qu'en est-il de l'utilisation d'autres clés telles que Index, Unique? Puis-je les utiliser? merci
user1844933
Peut-être que l'ordinateur est saturé de mémoire comme l'a dit Jason et se coupe au milieu du processus
ytpillai
67

J'ai une base de données avec plus de 97 000 000 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 index de table .

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

amir beygi
la source
10
L'ajout d'une "clé primaire" à une colonne (en sélectionnant l'incrémentation automatique) serait-il une indexation?
Nathan
8
@Nathan, en fait, lorsque vous affectez une colonne comme clé primaire, elle devient automatiquement indexée, mais chaque table ne peut avoir qu'une seule clé primaire, si vous devez ajouter un index pour une colonne, pour optimiser les requêtes, utilisez ce stackoverflow.com/ a / 3002635/932473
dav
J'ai une table avec un trilions mais la sélection des données au format IN LIFO est lente?
Saurabh Chandra Patel
Définissez ne pas avoir de problèmes. Combien de temps dure la requête la plus complexe? Nous avons une table avec 100 millions de lignes et un client s'attend à ce que les requêtes soient effectuées en 5 secondes maximum, quels que soient les critères de regroupement ou de classement qu'ils utilisent. Nos indices pourraient être améliorés , mais avant tout verrouiller en essayant d'ajouter un index
Joe Yahchouchi
20% des tables de production (selon une ancienne étude) ont plus de 1 million de lignes. J'en ai vu quelques-uns avec plusieurs milliards de lignes.
Rick James
19

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

Programmeur compagnon
la source
6
Bien que ce soit une bonne idée, cette réponse en elle-même n'est pas bonne à donner à un débutant. La sortie d'EXPLAIN n'est pas très intuitive ...
nickf
17
Il n'y a pas d'autre outil pour vous aider à examiner les requêtes, alors mieux vaut commencer à apprendre EXPLAIN- débutants ou non.
nos
30
ce serait bien si quelqu'un peut EXPLIQUER EXPLAIN ;)
Jo E.
7
@Deadpool Mysql Explain Explained
Sithsu
15

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 la quantité de données à charger en mémoire et à travailler activement). Si vous insérez simplement des données et que vous ne faites rien avec, c'est en fait un problème facile à résoudre.

  • Quel niveau de concurrence est requis? Y a-t-il un seul utilisateur qui insère / lit, ou avons-nous plusieurs milliers de clients fonctionnant à la fois?

  • Quels niveaux de promesse / durabilité et constance de performance sont nécessaires? Devons-nous nous assurer que nous pouvons honorer chaque engagement. Est-il correct si la transaction moyenne est rapide ou voulons-nous nous assurer que toutes les transactions sont fiables et rapides (contrôle de qualité six sigma comme - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- et-six-sigma / ).

  • Avez-vous besoin de faire des problèmes opérationnels, tels que ALTER le schéma de table? Dans InnoDB c'est possible, mais incroyablement lent car il faut souvent créer une table temporaire au premier plan (bloquant toutes les connexions).

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

  • Votre propre compétence pour rédiger des requêtes / avoir de bons index.
  • Combien de douleur vous pouvez tolérer en attendant les instructions ALTER TABLE.
Morgan Tocker
la source
2
Edit: Les conseils sur ALTER TABLE pour créer des tables temporaires sont un peu datés. MySQL 5.5 a une création d'index rapide, et 5.6 a maintenant DDL en ligne.
Morgan Tocker
3

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, ou 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 volumineux et causera probablement des problèmes.

GrayWizardx
la source
3

S'inscrire? Voulez-vous dire enregistrement?

Un million d'enregistrements n'est pas vraiment 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 le résoudre, très probablement.

Maintenant, évidemment, 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.

Incidemment, il n'y a pas de "dernier" enregistrement dans une table, d'un point de vue logique, ils n'ont pas d'ordre inhérent.

phoebus
la source
Je veux dire quelque chose comme "SELECT * FROM table ORDER BY id DESC LIMIT 0"
Juanjo Conti
4
Peut-être que vous avez besoin SELECT LAST_INSERT_ID()au lieu de cette requête.
True Soft
3

J'ai vu des tables non partitionnées avec plusieurs milliards d'enregistrements (indexés), qui se sont auto-jointes pour un 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 :)

File d'attente Jé
la source
2

En supposant que vous entendiez «enregistrements» par «registres» non, ce n'est pas trop, MySQL évolue très bien et peut contenir autant d'enregistrements que vous en avez 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 si ce n'est de s'assurer que les champs sont correctement indexés.

Thomas Bonini
la source
2
Techniquement, la taille de la table peut également être limitée par la taille de fichier maximale du système de fichiers que vous utilisez.
tster
0

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

Bien que 1 million 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 cache en mémoire par le serveur, les requêtes seront plus lentes.

jvilalta
la source
0

L'utilisation de la requête fournie sera exceptionnellement lente en raison de l'utilisation d'une méthode de tri et de fusion 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, aucun tri n'est donc nécessaire.

Louis
la source