web-dev-qa-db-fra.com

Accélérer la conversion de Myisam en InnoDB

J'ai un serveur MySQL 5.1 avec une base de données d'environ 450 tables, prenant 4 Go. La grande majorité de ces tables (tous sauf 2) sont myisam. Cela a été correct pour la plupart (pas besoin de transactions), mais l'application a gagné du trafic et que certaines tables ont été touchées en raison du verrouillage de table sur des mises à jour. C'est la raison 2 des tables sont innodub maintenant.

La conversion sur les petites tables (rangées de 100k) ne prend pas longtemps du tout, causant un temps d'arrêt minimal. Cependant, quelques-unes de mes tables de suivi approchent 50 millions de rangées. Y a-t-il un moyen d'accélérer un ALTER TABLE...ENGINE InnoDB sur de grandes tables? Et sinon, existe-t-il d'autres méthodes pour convertir une minimisation de temps d'arrêt sur ces tables lourdes?

15
Derek Downey

Permettez-moi de commencer par dire, je déteste changer. C'est mal, imho.

Dis, c'est votre schéma de table actuel -

CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;

Voici le chemin que je recommande -

Créez un nouvel objet de table qui remplacera l'ancien:

CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8

Insérez toutes les lignes de l'ancienne table par nom dans la nouvelle table:

INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;

Test de fumée Votre migration:

SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;

Échangez les noms de table afin que vous puissiez maintenir une sauvegarde au cas où vous auriez besoin de retourner.

RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;

Procéder au test de régression.

Cette approche devient de plus en plus préférable aux tables avec plusieurs index et des millions de lignes.

Les pensées?

10
randomx

1) La protection contre les pertes est fonction de la paranoïa. Toujours faire une sauvegarde. Si vous êtes vraiment paranoïaque, faites une sauvegarde puis restaurez à partir de la sauvegarde.

2) - Cette page du manuel MySQL a des instructions pour convertir des types de table.

Le moyen le plus rapide de modifier une table à Innodb est de faire des inserts directement sur une table InnoDB. C'est-à-dire, utilisez Alter Table ... Engine = InnoDB ou créez une table innodue vide avec des définitions identiques et insérez les lignes avec insert dans ... Sélectionnez * à partir de ....

3) PostgreSQL effectue une recherche en texte intégral , le moteur Sphinx Semble le faire pour MySQL

7

Il est plus facile d'optimiser l'ensemble du serveur (configuration de la mémoire, caches, index) lorsque vous n'avez qu'un seul moteur utilisé. Mixer Myisam avec InnoDB sur de grandes bases de données restera toujours bloquée à un moment donné de certains compromis par certains compromis pour les deux moteurs de travailler bien (mais pas excellent :)

Je vous recommande d'intéresser à certains moteurs de recherche de texte complets dédiés comme - Sphinx , Lucene ( Solr ) et supprimez-le de la couche de base de données.

3
sbczk