J'ai une table avec environ 1 milliard de lignes et 98% de lecture intensive.
J'ai essayé de régler la base de données, avec différents moteurs de stockage (MyISAM et InnoDB)
Ensuite, j'ai exécuté quelques tests pour voir les performances
Dans la clause where, j'avais un ID de clé primaire, et il semblait que, puisque MyISAM Key Cache stocke tous les index dans son tampon, l'utilisation de MyISAM semblait être assez rapide, environ 2 fois plus rapide que InnoDB
Mais pour InnoDB, ça semblait plus lent !! Est-ce qu'InnoDB n'utilise aucun tampon pour précharger les index?
Réponses:
Avant de choisir MyISAM ou InnoDB, vous devrez examiner les deux moteurs de stockage en fonction de la façon dont chaque cache
MyISAM
Lors de la lecture, les index d'une table MyISAM peuvent être lus une fois à partir du fichier .MYI et chargés dans le cache de clés MyISAM (tel que dimensionné par key_buffer_size ). Comment accélérer la lecture du .MYD d'une table MyISAM? Avec ça:
J'ai écrit à ce sujet dans mes précédents articles
Sep 20, 2011
: /dba/5974/best-of-myisam-and-innodb/6008#6008 (veuillez lire celui-ci en premier)May 10, 2011
: /dba/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643#2643 (TRADEOFF # 2)Aug 12, 2011
: /dba/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (paragraphe 3)Jan 03, 2012
: /dba/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (sous la rubrique Réplication )InnoDB
OK, et InnoDB? InnoDB effectue-t-il des E / S disque pour les requêtes? Étonnamment, oui! Vous pensez probablement que je suis fou de dire cela, mais c'est absolument vrai, même pour les requêtes SELECT . À ce stade, vous vous demandez probablement "Comment diable InnoDB fait-il des E / S disque pour les requêtes?"
Tout cela remonte à InnoDB étant un moteur de stockage transactionnel conforme à ACID . Pour qu'InnoDB soit transactionnel, il doit prendre en charge l'entrée
I
inACID
, qui est l'isolement. La technique pour maintenir l'isolement des transactions se fait via MVCC, Multiversion Concurrency Control . En termes simples, InnoDB enregistre à quoi ressemblent les données avant que les transactions tentent de les modifier. Où cela est-il enregistré? Dans le fichier d'espace disque logique du système, mieux connu sous le nom ibdata1. Cela nécessite des E / S disque .COMPARAISON
Étant donné qu'InnoDB et MyISAM effectuent des E / S disque, quels facteurs aléatoires déterminent qui est le plus rapide?
DELETEs
etUPDATEs
ÉPILOGUE
Ainsi, dans un environnement de lecture intensive, il est possible qu'une table MyISAM avec un format de ligne fixe surpasse les lectures InnoDB du pool de tampons InnoDB s'il y a suffisamment de données écrites dans les journaux d'annulation contenus dans ibdata1 pour prendre en charge le comportement transactionnel imposées aux données InnoDB. Planifiez soigneusement vos types de données, vos requêtes et votre moteur de stockage. Une fois les données en croissance, il peut devenir très difficile de déplacer les données.
Au fait, j'ai écrit quelque chose comme ça il y a 5 jours: Comment attribuer une limite de mémoire pour mySQL?
la source
MyISAM fonctionnera toujours beaucoup plus rapidement que innodb lorsqu'il n'y a pas de conflit pour les données. Commencez à ajouter plusieurs sessions en essayant de mettre à jour le même tablse, et innodb obtient très rapidement l'avantage en termes de performances.
La façon dont vous réglez le système pour les 2 moteurs est très différente.
La raison pour laquelle différents moteurs existent est parce que différentes charges de travail / modèles d'accès existent.
la source
vous devez vous «réchauffer» innodb. par exemple en relisant les journaux d'accès ou en exécutant des requêtes intelligentes qui toucheront chaque valeur de l'index.
jetez un oeil ici ou ici .
j'espère que vous n'utilisez pas les paramètres mysql par défaut pour innodb - ils étaient adaptés au matériel de ~ 2000.
la source
Consultez ce site, il contient des informations très utiles:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
Vous pouvez également régler votre système de fichiers. J'ai de bons résultats de performance sur XFS avec des valeurs optimales de sunit et swidth (bien sûr si vous utilisez RAID)
la source
Après avoir optimisé InnoDB sur MariaDB, j'ai augmenté la
innodb_buffer_pool_size
taille de ma base de données InnoDB, car, ce faisant, InnoDB a commencé à récupérer les lignes plus rapidementJe suppose que le réglage d'InnoDB est assez important en fonction des besoins de votre base de données
la source