J'ai un serveur mysql 5.1 avec une base de données d'environ 450 tables, occupant 4 Go. La grande majorité de ces tables (toutes sauf 2) sont MyIsam. Cela a été très bien pour la plupart (pas besoin de transactions), mais l'application a gagné du trafic et certaines tables ont été affectées en raison du verrouillage des tables lors des mises à jour. C'est la raison pour laquelle 2 des tableaux sont maintenant InnoDB.
La conversion sur les petites tables (100 000 lignes) ne prend pas beaucoup de temps, ce qui entraîne un temps d'arrêt minimal. Cependant, quelques-unes de mes tables de suivi approchent de 50 millions de lignes. Existe-t-il un moyen d'accélérer un ALTER TABLE...ENGINE InnoDB
sur de grandes tables? Et si ce n'est pas le cas, existe-t-il d'autres méthodes pour convertir les temps d'arrêt minimisés sur ces tableaux lourds en écriture?
la source
Réponses:
Permettez-moi de commencer par dire que je déteste ALTER. C'est mauvais, à mon humble avis.
Dites, ceci est votre schéma de table actuel -
Voici le chemin que je recommande -
Créez un nouvel objet table qui remplacera l'ancien:
Insérez toutes les lignes de l'ancienne table par nom dans la nouvelle table:
Testez votre migration de fumée:
Échangez les noms de table afin de pouvoir conserver une sauvegarde au cas où vous auriez besoin de restaurer.
Passez aux tests de régression.
Cette approche devient de plus en plus préférable avec des tables avec plusieurs index et des millions de lignes.
Pensées?
la source
ALTER TABLE
prendrait plus de temps queINSERT INTO...SELECT
sur 50 millions de lignes?1) La protection contre les pertes est fonction de la paranoïa. Faites toujours une sauvegarde. Si vous êtes vraiment paranoïaque, faites une sauvegarde puis restaurez à partir de la sauvegarde.
2) Cette page du manuel MySQL contient des instructions pour convertir les types de table.
3) PostgreSQL effectue une recherche en texte intégral , le moteur Sphinx semble le faire pour MySQL
la source
Il est X fois plus facile d'optimiser l'ensemble du serveur (configuration de la mémoire, caches, index) lorsque vous n'avez qu'un seul moteur utilisé. Mélanger myisam avec innodb sur de grandes bases de données sera toujours bloqué à un moment donné par certains compromis pour que les deux moteurs fonctionnent bien (mais pas excellents :)
Je vous recommande de vous intéresser à certains moteurs de recherche en texte intégral dédiés tels que sphinx , lucene ( solr ) et de vous en débarrasser de la couche de base de données.
la source