5 votes

Clé primaire importante : 1+ milliard de lignes MySQL + InnoDB ?

Je me demandais si InnoDB serait la meilleure façon de formater la table ? La table contient un champ, une clé primaire, et la table recevra 816k lignes par jour (estimation). Elle va devenir très volumineuse très rapidement ! Je travaille sur une méthode de stockage de fichiers (serait-ce plus rapide) ? La table va stocker les numéros d'identification des identifiants Twitter qui ont déjà été traités ?

En outre, toute estimation de l'utilisation de la mémoire sur un SELECT min('id') déclaration ? Toute autre idée sera grandement appréciée !

6voto

Eran Galperin Points 49594

Je vous recommande de commencer par partionnement votre table par ID ou par date. Le partitionnement divise une grande table en plusieurs tables plus petites selon une logique définie (comme la division par plages de dates), ce qui les rend beaucoup plus faciles à gérer en termes de performances et de mémoire. MySQL 5.1 intègre cette fonctionnalité, ou vous pouvez l'implémenter en utilisant des solutions personnalisées.

En stockant l'implémentation dans un fichier plat, vous perdez tous les avantages d'une base de données - vous ne pouvez plus effectuer de requêtes sur les données.

2voto

ʞɔıu Points 15907

La seule réponse définitive est d'essayer les deux, de tester et de voir ce qui se passe.

En général, MyISAM est plus rapide pour les écritures et les lectures, mais pas pour les deux en même temps. Lorsque vous écrivez dans une table MyISAM, la table entière est verrouillée jusqu'à ce que l'insertion soit terminée. InnoDB a plus de frais généraux, mais utilise un verrouillage au niveau des lignes, de sorte que les lectures et les écritures peuvent se faire simultanément sans les problèmes liés au verrouillage de la table MyISAM.

Cependant, si je comprends bien, votre problème est un peu différent. Le fait de n'avoir qu'une seule colonne, cette colonne étant une clé primaire, a une incidence importante sur les différentes façons dont MyISAM et InnoDB gèrent les index de clé primaire.

Dans MyISAM, l'index de clé primaire est comme tout autre index secondaire. En interne, chaque ligne possède un identifiant de ligne et les nœuds d'index pointent simplement vers les identifiants de ligne des pages de données. Un index de clé primaire n'est pas traité différemment d'un autre index.

Dans InnoDB, cependant, les clés primaires sont regroupées, ce qui signifie qu'elles restent attachées aux pages de données et garantissent que le contenu des lignes reste dans un ordre physiquement trié sur le disque en fonction de la clé primaire (mais uniquement au sein de pages de données uniques, qui peuvent elles-mêmes être dispersées dans n'importe quel ordre).

Dans ce cas, je m'attends à ce qu'InnoDB ait un avantage dans la mesure où MyISAM devrait essentiellement faire un double travail : écrire l'entier une fois dans les pages de données, puis l'écrire à nouveau dans les pages d'index. InnoDB n'aurait pas à faire cela, l'index de la clé primaire serait identique aux pages de données et n'aurait à écrire qu'une seule fois. Il n'aurait à gérer les données qu'à un seul endroit, alors que MyISAM devrait inutilement gérer deux copies.

Pour l'un ou l'autre des moteurs de stockage, faire quelque chose comme min() ou max() devrait être trivial sur une colonne indexée, ou simplement vérifier l'existence d'un nombre dans l'index. Étant donné que la table ne comporte qu'une seule colonne, aucune recherche dans les signets ne serait nécessaire, car les données seraient entièrement représentées dans l'index lui-même. Cet index devrait être très efficace.

Je ne m'inquiéterais pas non plus de la taille de la table. Lorsque la largeur d'une ligne n'est qu'un entier, il est possible d'insérer un grand nombre de lignes par page d'index ou de données.

1voto

flussence Points 5870

Si ces numéros d'identification augmentent de façon monotone et que vos écritures ne font qu'ajouter des données (sans jamais les modifier), il sera probablement beaucoup plus rapide d'utiliser un seul fichier. A SELECT min('id') devient alors une simple lecture de la première ligne du fichier, et tout le reste est une recherche binaire.

0voto

Si vous avez un index sur la colonne id, select min(id) devrait être O(1), ce qui ne devrait pas nécessiter beaucoup de mémoire.

Si votre clé primaire est sur l'identifiant twitter, alors vous avez un index dessus.

0voto

Christian Lescuyer Points 8656

Il existe une bonne comparaison des moteurs de stockage sur la zone de développement de MySQL :

D'après votre description, je dirais que MyISAM serait mieux, mais cela dépend beaucoup des schémas de lecture et d'écriture comparés de votre application.

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