web-dev-qa-db-fra.com

Utilisation appropriée de la table Optimize MySQL

Je veux trouver de meilleures pratiques pour maintenir notre base de données MySQL, versions 5.5/6 et utiliser innoDB.

Je suis tombé sur ce article qui dit essentiellement que l'optimisation de la table:

  1. ne pas montrer beaucoup d'amélioration au cas où vos requêtes n'utilisent pas le PK.
  2. d'autres index sur la table sont construits dans un ordre pseudo-aléatoire et ne bénéficieraient probablement pas de la table d'optimisation.
  3. pourrait en fait faire des mises à jour plus lentement en raison du fait que chaque modification a maintenant une probabilité plus élevée de résultant d'une scission de page.

Mes questions sont:

  1. Les 3 points ci-dessus sont-ils toujours vraies? Partiellement? Pas du tout?
  2. Quand est-ce un bon coup d'essayer d'optimiser une table?
  3. Dans quels cas optimisant une table ne bénéficieraient ni même à des utilisations de la table pire?
  4. Y a-t-il un moyen d'optimiser les index d'une table autre que son PK?
8
Daniel A.

Baron Schwartz, l'auteur de ce poste, est l'un des coauteurs de Haute performance MySQL, 3ème édition , l'un des meilleurs livres là-bas concernant la performance MySQL. Bien que l'argument de l'autorité ne soit pas toujours bon, je voudrais remarquer que probablement il sait ce qu'il dit.

Alors que tout ce qu'il dit est correct - à mon humble opinion -, vous devez comprendre l'argument sous-jacent réel: défragmenter une table InnoDb est dans de nombreux cas inutiles (pour la performance) et de nombreuses personnes recommandant de le faire fréquemment.

La fragmentation et la scission de page est un sujet délicat, que des personnes comme Jeremy Cole http: //blog.jcole.us/2013/04/09/innodb-bugs-cound-During-Research-on-innodb-Data -storage / et Facebook Les ingénieurs ont mentionné beaucoup (spécialement, concernant la compression): https: //www.facebook.com/note.php? note_id = 10150348315455933 et ses implications sur la performance.

Plusieurs fois, votre performance dépend de la charge-charge-si vous insérez à l'aide d'un incrément automatique? Insérez-vous et supprimez-vous plusieurs fois au milieu de votre table? Pouvez-vous vous permettre l'espace disque supplémentaire si votre table est très dynamique?

Il y a quelques bonnes pratiques que je peux vous recommander (ce qui est probablement ce que vous voulez):

  • Défragmenter uniquement si vous avez fait une suppression de lot de lots d'enregistrements (et que vous n'avez pas l'intention de les insérer). Dans d'autres cas, il peut ne pas être nécessaire. Si vous voulez savoir s'il y a une énorme différence entre les données logiques et la taille du fichier, comparez le fichier .idb avec la taille de données + index à partir du statut de la table Afficher.
  • Insertion de vitesse en insérant toujours dans l'ordre de clé primaire, vous ne forcez donc pas les divisions de page inutiles.
  • Utilisez la partition pour isoler les modifications susceptibles de modifier la structure interne de la table.
  • Il n'y a aucun moyen de "optimiser les indices secondaires", mais je ne trouverais jamais une telle chose nécessaire. Le tampon de changement garantit que les modifications/rééquilibrances aux index sont effectuées de manière asynoncile sans problèmes de performance énormes. Un BTREE doit toujours être équilibré, alors en supposant que votre tampon de changement n'est pas plein et que le fil de purge supprime rapidement les enregistrements de rangée, votre performance devrait être correcte. Une façon de penser à "optimiser les index secondaires", comme vous l'avez appelé, abandonne l'index et la recréant (asumant que vous utilisez le plugin Innodb ou MySQL 5.5+), mais je vois absolument aucune raison de faire ça.

Bien sûr, si vous voulez vraiment creuser dans ce sujet, créez des tables, de les défragmenter et de vérifier si vous avez en réalité gagnez ensuite. En général, la gestion des espaces de table et la collecte de statistiques est quelque chose de relativement automatique sur InnoDB.

7
jynus