2008-12-09 9 views
3

Pour une application web que je développe, j'ai besoin de stocker un grand nombre d'enregistrements. Chaque enregistrement consistera en une clé primaire et une seule valeur de chaîne (short-ish). Je m'attends à avoir environ 100 Go de stockage disponible et j'aimerais pouvoir tout utiliser.Grandes tables MySQL

Les enregistrements seront insérés, supprimés et lus fréquemment et je dois utiliser une base de données MySQL. L'intégrité des données n'est pas cruciale, mais les performances le sont. Quels problèmes et pièges suis-je susceptible de rencontrer et quel moteur de stockage serait le mieux adapté à la tâche?

Un grand merci, J

+0

Avec quelles sortes de données travaillez-vous lorsque vous avez une table de hachage de 100 Go (ou, pire, un tableau)? Vous vous inquiétez des moteurs de stockage mais il semble que vous souhaitiez essayer de modéliser vos données plus efficacement. –

+0

C'est pire qu'un tableau, les données forment naturellement un réseau. Le tableau que j'ai mentionné contient les nœuds. Il devrait y avoir une table pour les bords. Peut-être que je dois poser une question séparée à ce sujet. – Snukker

Répondre

5

Quelle que soit la solution que vous utilisez, puisque vous dites que votre base de données sera trop lourde en écriture besoin de s'assurer que toute la table ne se verrouille pas sur les écritures. Cela exclut MyISAM, ce que certains ont suggéré. MyISAM verrouille la table sur une mise à jour, supprimer ou insérer. Cela signifie que tout client qui veut lire à partir de la table devra attendre que l'écriture se termine. Ne sais pas ce que fait INSERT LOW PRIORITY, probablement un peu de blocage de table :-)

Si vous devez simplement utiliser MySQL, vous aurez besoin d'InnoDB, qui ne se verrouille pas en écriture. Je ne sais pas comment MySQL gère les tables InnoDB de VACUUM (InnoDB est MVCC comme PostgreSQL et doit donc être nettoyé) ... mais vous devrez en tenir compte si vous faites beaucoup de mises à jour ou de suppressions.

1

Si vous utilisez l'indexation (et même si vous n'êtes pas) vous pouvez rencontrer des problèmes d'échelle. Vous pouvez essayer de partitionner pour essayer de réduire ces effets.

Dans mon propre projet, l'intégrité n'est pas cruciale mais les performances aussi. Ce que nous avons fait a été de relâcher toutes les exigences transactionnelles, d'assouplir les exigences de synchronisation des disques et de valider les insertions par lots, et nous avons vraiment amélioré nos vitesses d'écriture.

De même, assurez-vous de faire vos propres tests pour régler la taille de votre mémoire. Je crois que MySQL a quelques types de caches différents dont vous pouvez configurer la taille.

0

Vous voulez absolument utiliser MyISAM pour le moteur de stockage. Mais vous dites que vous attendez 100 Go et il ne contiendra qu'une valeur de chaîne courte. Vous voulez certainement utiliser un int 64 bits pour votre identité/clé primaire.

Mais ma vraie question est. L'utilisez-vous pour stocker des informations de session sur le site Web? Si c'est le cas, vous voulez utiliser memcache au lieu de MySQL.

+0

Ce n'est pas pour l'information de session. Les valeurs sont dérivées d'URL extraites de pages Web. Désolé - ne peut pas révéler plus, mais merci tout de même! – Snukker

+1

MyISAM verrouille toute la table sur les mises à jour, les insertions ou les suppressions et est donc un très mauvais choix pour une utilisation en écriture intensive. Le PO dit qu'il fait beaucoup de mises à jour, d'insertions ou de suppressions. Si vous devez utiliser MySQL, InnoDB est meilleur pour la lecture/écriture car il ne verrouille pas toute la foutue table pour les écritures. –

0

grandes requêtes MySQL font mon accident Ram Quad Core/8 Go DB serveur ...

solution

est d'utiliser PostgresSQL (SQL Server si vous pouvez vous le permettre)

+0

grandes tables! = Grosses requêtes - bien sûr, les requêtes de grande taille (et/ou mal conçues) vont causer des problèmes de performances. Quad Core/8GB est assez faible pour un serveur DB de production - c'est seulement 2GB par cœur - une ration que j'utilise pour les PC de bureau ... – Ian

+0

mysql plantait par intermittence sur les requêtes (parfois la logique métier est vraiment complexe). déplacer le système vers le serveur sql sur une machine comparable avec exactement les mêmes requêtes ne provoque plus de plantage ... et même une exécution plus rapide. aller google le mauvais état actuel de mysql ... – mson

3

Tout dépend du modèle de lecture/écriture votre application génère et le niveau de précision que vous voulez obtenir. Par exemple, si vous ne vous souciez pas vraiment d'avoir toutes les dernières lignes insérées immédiatement disponibles, pensez à utiliser INSERT LOW PRIORITY pour aider les SELECTs. Si la taille du texte est relativement petite, vous pouvez utiliser un type CHAR fixe qui aidera à indexer beaucoup et réduire le temps de SELECTs Si votre application génère beaucoup de mises à jour, vous préférerez le moteur de stockage InnoDB qui permet de verrouiller un seul ligne lors de la mise à jour (vs toute la table sur myISAM). D'autre part, il est plus gourmand en ressources processeur, donc si vous n'utilisez pas de transactions et que votre motif de mise à jour est relativement petit, envisagez d'utiliser myISAM

0

Vous êtes beaucoup mieux si la "chaîne courte" est dans une colonne de longueur fixe de sorte que la table a des rangées de longueur fixe. MySQL avec MyISAM fonctionnera assez efficacement pour vous alors. Allouer autant de mémoire que vous pouvez pour le tampon de clé afin qu'une grande partie de l'index en mémoire.Votre objectif devrait être un seul accès aléatoire au disque pour récupérer une ligne - vous ne pouvez pas faire mieux que celui donné 100 Go de données et 8 Go de mémoire. Vous ne devriez pas vous attendre à atteindre plus de quelques centaines de requêtes de ce type par seconde, car ce sont tous les accès aléatoires qu'un disque peut faire.

Vous pourriez être intéressé par mon moteur de stockage MySQL personnalisé (décrit here). Il gère la mémoire différemment de MyISAM, bien que le profil de votre application ne soit pas exactement celui pour lequel mon moteur a été optimisé.