MyISAM pour les lectures de données

10

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?

Akash
la source
Peut-être que l'un des modérateurs heureux déclencheurs ayant voté pour clore la question peut développer ses motivations?
pQd
Pouvez-vous nous donner une idée de la taille de la base de données et de la table en question? La taille totale sur le disque serait utile. De plus, quelle est la machine sur laquelle vous exécutez?
Dave Rix

Réponses:

6

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:

ALTER TABLE mytable ROW_FORMAT=Fixed;

J'ai écrit à ce sujet dans mes précédents articles

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 Iin ACID, 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?

  • Taille des colonnes
  • Format de colonne
  • Jeux de caractères
  • Plage de valeurs numériques (nécessitant des INT suffisamment grands)
  • Rangées divisées en blocs (chaînage de lignes)
  • Fragmentation des données causée par DELETEsetUPDATEs
  • Taille de la clé primaire (InnoDB a un index clusterisé, nécessitant deux recherches de clé)
  • Taille des entrées d'index
  • la liste continue...

É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?

RolandoMySQLDBA
la source
innodbe génère-t-il vraiment des lectures de disque lorsque toutes les données sont déjà dans le pool de tampons et qu'il n'y a pas de demandes de modification de données simultanées, juste des lectures?
pQd
Je suppose que, comme le demandeur a 1 milliard de lignes dans sa base de données, il est peu probable qu'il ait tout mis en cache dans la RAM dans le pool de tampons - par conséquent, des lectures seront nécessaires pour accéder aux données en dehors du pool de tampons et sur le disque?
Dave Rix
3

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.

symcbean
la source
2

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.

pQd
la source
J'ai apporté des modifications dans la configuration par défaut, j'ai également exécuté la requête plusieurs fois, environ 30 fois, mais j'ai produit presque les mêmes résultats. Il était plus rapide après quelques essais, mais est resté plus lent que MYISAM, a également utilisé MariaDB (dernière version)
Akash
0

Après avoir optimisé InnoDB sur MariaDB, j'ai augmenté la innodb_buffer_pool_sizetaille de ma base de données InnoDB, car, ce faisant, InnoDB a commencé à récupérer les lignes plus rapidement

Je suppose que le réglage d'InnoDB est assez important en fonction des besoins de votre base de données

Akash
la source