Optimisation des paramètres par défaut d'InnoDB

8

J'ai regardé dans my.ini et j'ai vu divers paramètres par défaut. Ma base de données fonctionne sur un seul PC autonome. Je veux optimiser les performances d'InnoDB et de MySQL en général pour les performances. Il n'y a aucune contrainte d'espace disque. Quels paramètres par défaut dois-je modifier pour optimiser les performances, la fiabilité et les sauvegardes ponctuelles possibles [haute disponibilité].

Édité

À l'heure actuelle, chaque fois que j'exécute "Optimiser les tables" via Maintenance sur l'administrateur MySQL, cela montre:

Le tableau ne prend pas en charge l'optimisation, recréer + analyser à la place

sur toutes les tables. Toutes mes tables sont InnoDB, mais pourquoi ne prennent-elles pas en charge Optimiser?

RPK
la source
cette modification mérite une question distincte, imo. Jetez un œil à la documentation OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB prend en charge la commande, mais le processus est différent de MyISAM
Derek Downey

Réponses:

11

La façon de régler InnoDB est centrée sur

  • InnoDB Buffer Pool: il met en cache les pages de données et les pages d'index. La quantité de données et d'index que vous pouvez mettre en cache n'est pas fonction des contraintes d'espace disque mais de la mémoire disponible et de l'espace disque actuellement utilisés par InnoDB.
  • InnoDB MetaData: Par défaut, le fichier ibdata1 héberge normalement tout et tout InnoDB. Cela comprendrait les pages de données, les pages d'index, les métadonnées de table, les données MVCC .

Voici une formule que j'ai utilisée au cours des 5 dernières années pour calculer le pool de tampons InnoDB en fonction de l'espace disque utilisé par les pages de données et d'index InnoDB :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Utiliser (SELECT 0 Power1024) pour les octets
  • Utiliser (SELECT 1 Power1024) pour KB
  • Utiliser (SELECT 2 Power1024) pour MB
  • Utiliser (SELECT 3 Power1024) pour GB
  • Utilisez (SELECT 4 Power1024) pour TB (Envoyez-moi un e-mail si vous avez des TerraBytes de RAM)

Bien sûr, j'ai dit une fonction de la mémoire disponible et de l'espace disque actuellement utilisé par InnoDB. À partir d'ici, utilisez simplement le bon sens. LE NOMBRE RECOMMANDÉ DE LA REQUÊTE CI-DESSUS NE DEVRAIT PAS DÉPASSER 75% DE LA RAM INSTALLÉE !!! C'est la règle empirique la plus simple pour dimensionner le pool de tampons InnoDB.

Vous devez également définir innodb_flush_method sur O_DIRECT car il fournira des écritures synchrones stables d'InnoDB. J'ai également écrit un article sur la façon d'optimiser le stockage sur disque pour InnoDB .

En ce qui concerne le message, la table ne prend pas en charge l'optimisation, en recréant + analysant à la place , la raison pour laquelle vous obtenez ce message d'erreur est le fait que le moteur de stockage est InnoDB. Mécaniquement, OPTIMIZE TABLE copie simplement la table dans une table temporaire et exécute ANALYZE TABLE .

En réalité, ANALYZE TABLE contre InnoDB est complètement inutile. Même si vous avez exécuté ANALYZE TABLE sur une table InnoDB, le moteur de stockage InnoDB effectue des plongées dans l'index pour les approximations de cardinalité maintes et maintes fois, détruisant ainsi les statistiques que vous venez de compiler. En fait, Percona a effectué des tests sur ANALYZE TABLE et est également arrivé à cette même conclusion .

Voici d'autres articles que j'ai publiés au cours de l'année sur InnoDB Tuning

RolandoMySQLDBA
la source
Mon PC a 2 Go de RAM et InnoDB_Buffer_Pool_Size est par défaut réglé sur 6M. Je l'ai augmenté à 500 millions. Aucune suggestion?
RPK
Réglez-le à 1536M, ce qui correspond à 1,5G, car 75% de la RAM installée
RolandoMySQLDBA
J'ai exécuté votre requête, et elle donne une sortie 45G. La RAM de mon serveur est de 8G. Dois-je absolument augmenter ma RAM? Ou il y a des conditions à la requête ci-dessus ..
Stewie
@Stewie Si vous avez 45 G d'InnoDB, 60 Go de RAM sont ce dont vous avez besoin si vous avez le budget. Comme vous n'avez que 8G, 75% de la RAM installée (6G) est suffisante.
RolandoMySQLDBA
@RolandoMySQLDBA: super article! Mais je ne comprends pas très bien pourquoi dans le cas de Stewie, sa RAM n'est que de 8 Go mais la sortie de sa requête peut être supérieure à 8 Go (45G dans ce cas.) Pourriez-vous éclairer?
Chubaka
3

Voici un article plus ancien sur les variables importantes à «réglage grossier». Le plus important étant probablementinnodb_buffer_pool_size

Je recommanderais fortement la mise à niveau vers MySQL 5.5 (si vous ne l'utilisez pas déjà). Ils ont apporté plusieurs modifications aux performances d'InnoDB. Ils fournissent même une section générale sur la façon d'optimiser pour InnoDB maintenant qu'il s'agit du moteur par défaut: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

En ce qui concerne les sauvegardes ponctuelles, vous voudrez regarder le journal binaire . La base de l'activation est de définir la log-binvariable dans votre my.cnf

Derek Downey
la source
J'ai mis à niveau vers MySQL 5.5.
RPK
2

Optimiser vient dans beaucoup de couleurs.

Je pense que votre première étape devrait être de décider ce que "optimiser" signifie pour vous. Pour certaines personnes, cela signifie "requêtes SELECT les plus rapides". Pour d'autres, cela signifie "le meilleur équilibre entre les performances SELECT et les performances INSERT". Pour d'autres encore, "la performance INSERT la plus rapide".

Vous devez décider quels sont vos critères et comment vous allez savoir si vos modifications vous aident avant de commencer le réglage.

Ensuite, placez vos fichiers de configuration et vos options de démarrage sous contrôle de version et commencez à expérimenter. Documentez les conseils que vous suivez et où vous les avez trouvés. (Les conseils changent au fil du temps, à mesure que la base de code et le matériel changent.) Mettez également ces documents sous contrôle de version.

Mike Sherrill 'Cat Recall'
la source