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.
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:
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)
Utilisez "expliquer" pour examiner votre requête et voir s'il y a un problème avec le plan de requête.
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:
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 :)
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.
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.
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.
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.
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.