Quelle est la meilleure façon de planifier l'optimisation automatique des tables dans une base de données MySQL InnoDB? Puis-je utiliser des événements par exemple? J'ai récemment eu une grosse problème de performance (lors de l'interrogation) avec l'une des tables qui est en fait la plus grande dans ma base de données et en cours de mise à jour fréquemment. Après avoir exécuté Optimiser sur la table, cela a résolu le problème.
Optimiser la table effectue les étapes suivantes en interne sur une table (mydb.mytable)
CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;
Comme il est impliqué DDL, il n'ya aucun moyen de faire passer une grosse performance au cours de l'opération. De plus, n'effectuez aucune optimisation serait aussi mauvaise.
Ce dont vous avez besoin est d'avoir MySQL Master/Master (AKA Circular) de réplication mis en place
Vous pourriez alors essayer ceci:
Pour les serveurs M1 et M2 et DB VIP pointant sur M1
Sur m2, exécutez ce qui suit
STOP SLAVE;
SET sql_log_bin = 0;
Perform OPTIMIZE TABLE or ALTER TABLE ... ENGINE=InnoDB on all InnoDB tables
START SLAVE;
Wait for replication to catch (Seconds_Behind_Master = 0)
Le SET sql_log_bin = 0
Empêcherait les commandes DDL de se répliquer sur le maître.
Une fois ces étapes terminées, promouvoir l'esclave à maîtriser et rétrograder le maître à esclave (peut faire en déplaçant simplement votre DB VIP de M1 à M2). Vous pouvez effectuer cet entretien chaque jour et la production ne ressentira aucun effet à l'exception de la promotion principale et de la rétrogradation des esclaves.
Vous pouvez créer le script et l'exécuter sur M2 comme ceci:
echo "SET sql_log_bin = 0;" > InnoDBCompression.sql
echo "STOP SLAVE;" >> InnoDBCompression.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBCompressionSQL FROM information_schema.tables WHERE engine='InnoDB' ORDER BY (data_length+index_length)" >> InnoDBCompression.sql
echo "START SLAVE;" >> InnoDBCompression.sql
mysql -u... -p... -A < InnoDBCompression.sql
À partir de là, attendez juste des secondes_behind_master 0 sur M2, puis déplacez le DBVIP de M1 en M2. Maintenant, si vous connaissez les noms spécifiques des tables que vous souhaitez optimiser, vous pouvez ajuster la requête pour aller chercher uniquement ces tables.
Essaie !!!
CAVEAT
Voici un avertissement équitable: ( si vous avez INNODB_FILE_PER_TABLE DISBALLÉE, chaque fois que vous exécutez OPTIMIZE TABLE
Ou ALTER TABLE ... ENGINE=InnoDB;
Le fichier ibdata1 augmente. Vous seriez Besoin de nettoyer l'infrastructure innodub Pour empêcher Ibdata1 de grandir hors de contrôle.
Vous pouvez utiliser des événements pour exécuter une optimisation périodique, mais je reçois le sentiment si vous avez vécu de telles améliorations, vous devrez peut-être regarder ailleurs.
Un optimisation sur INNODB est efficacement en train de faire en sorte que Alter Table Engine = Innodb pour la reconstruire, recouvrant l'espace vide qui résulte de la suppression de nombreuses lignes. Une estimation de la quantité de données n'est-elle réellement utilisée peut-elle être trouvée en comparant les numéros data_length et data_free dans le statut de tableau Afficher.
Après avoir effectué l'optimisation, le système d'exploitation a maintenant autant de tableau que possible dans le cache de disque car il suffit de lire le tout. Cela donnera des améliorations à court terme jusqu'à ce que les pages moins fréquemment accessibles soient purgées du cache.
Dans un monde parfait, vous définiriez votre innodb_buffer_pool_size assez large, de sorte qu'il est capable de conserver toutes vos tables innovées en mémoire. Bien sûr, cela n'est pas toujours possible grâce aux budgets ou à des ensembles de données suffisamment volumineux. Dans le même temps, s'il s'agit d'un serveur DB dédié avec uniquement des tables InnoDB, définissez le pool tampon à 70 à 80% de la mémoire du système, laissant le reste pour le cache supérieur et le cache de disque.
ÉDITER
Dans le même ordre d'idées d'assurer le matériel approprié, obtenez aussi des disques rapides que vous le pouvez. Cartes basées sur la SSD PCI-E telles que Fusion IO sont les meilleurs que vous puissiez faire aujourd'hui. Ne peut pas se permettre ça? Ensuite, obtenez une multis broche SAS Array de disque RAID.