2010-08-03 5 views
2

J'ai une grande table mysql MyISAM avec 1,5mil rangées et 4,5 Go de large, toujours en augmentation tous les jours.Grande table MySQL - Conseil nécessaire

J'ai effectué toute l'indexation nécessaire et les performances ont été grandement optimisées. Pourtant, la base de données se décompose parfois (indiquant 500 erreur interne du serveur), généralement en raison de la surcharge de la requête. Chaque fois qu'il y a une panne, la table va commencer à travailler très lentement et je vais devoir faire une tâche idiote mais efficace: copier toute la table sur une nouvelle table et remplacer la nouvelle par l'ancienne !!

Vous pouvez demander pourquoi une telle action stupide. Pourquoi ne pas réparer ou optimiser la table? J'ai essayé cela mais le temps pour faire la réparation ou l'optimisation peut être plus que le temps de simplement dupliquer la table et plus important encore la nouvelle table exécute beaucoup plus rapidement.

La table nouvellement construite fonctionne habituellement très bien. Mais au fil du temps, il deviendra léthargique (peut-être après un mois) et conduira éventuellement à une autre panne (500 serveur interne). C'est alors que tout ralentit considérablement et que je dois répéter le processus stupide de remplacement de la table. Pour plus d'informations: - Les données de la table sont rarement supprimées. Il n'y a donc pas beaucoup de frais généraux dans la table. - Dans des conditions optimales, chaque requête prend 1-3 s. Mais quand il devient lent, la même requête peut prendre plus de 30 secondes. - La table a 24 champs, 7 sont int, 3 sont texte, 5 sont varchar et le reste sont smallint. C'est utilisé pour contenir des articles.

Si vous pouvez expliquer ce qui cause la lenteur ou si vous avez des suggestions sur la façon d'améliorer la situation, n'hésitez pas à la partager. Je serai très reconnaissant.

+0

Une question: Cette table utilise-t-elle des lignes de longueur variable? – zebediah49

+0

pouvez-vous poster votre requête et "EXPLAIN" sortie? –

+0

Pour zebediah, autre que int, text, varchar et smallint, cette table n'utilise pas d'autres types. La longueur dans le texte peut cependant varier. Pour Maris, la table est bien optimisée grâce à l'indexation. Chaque demande est faite sans besoin de tri. J'ai utilisé Explain pour vérifier chaque requête afin de m'assurer que chaque requête est optimisée. – Judy

Répondre

2

Envisagez de passer à InnoDB. Un de ses avantages est qu'il est en sécurité. Si vous avez besoin de fonctionnalités de texte intégral, vous pouvez y parvenir en implémentant des outils externes tels que Sphinx ou Lucene.

+0

Je recommande toujours InnoDB sur ISAM, j'ai sauté, bonne recommandation. – marr75

1

Le partitionnement est une stratégie courante ici. Vous pourrez peut-être partitionner les articles selon le mois où ils ont été validés dans la base de données (par exemple) et avoir votre compte de requête pour retourner les résultats du mois d'intérêt (comment vous partitionnez la table et le design de votre application /comportement). Vous pouvez obtenir des résultats d'union si vous avez besoin que vos résultats proviennent de plusieurs tables.

Encore mieux, selon votre version de MySQL, le partitionnement peut être supporté par votre serveur. Voir this pour plus de détails.

+0

Il y aura beaucoup de références croisées, par exemple la génération de messages liés pour chaque article. Cela signifie la plupart du temps que l'enquête nécessitera UNION de toutes les tables partitionnées. Compte tenu de cela, la partition est-elle un bon choix? – Judy

+0

Fera-t-il cette génération en temps réel ou par lots? Y a-t-il une limite raisonnable sur la distance à laquelle vous pouvez chercher des publications liées? Les données sont-elles fréquemment mises à jour? – marr75

+0

génération est en temps réel. Aucune limite sur combien de temps en arrière. Les données sont fréquemment mises à jour quotidiennement, par lots. – Judy

Questions connexes