web-dev-qa-db-fra.com

Mysql: insérer les performances INNODB vs MYISAM

J'insère dans une petite table simple avec 5 attributs et 1000 lignes.

J'ai observé que lorsque le moteur est INNODB, chaque insert prend 0,03 à 0,05 seconde. J'ai changé le moteur en MYISAM, puis les inserts sont plus rapides. cela prend 0,001 - 0,003.

Quel est le problème. innodb_flush_log_trx_commit = 1 par défaut. J'étais ce paramètre tel qu'il est. Voici mon réglage innodb.

innodb_log_buffer_size : 1MB
innodb_log_file_size   : 5MB
innodb_buffer_pool_size: 8MB
innodb_flush_log_trx_commit = 1

mysql> desc table ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| count | int(10) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

VARIABLES

mysql> show variables like 'innodb%' ;
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index              | ON                     |
| innodb_additional_mem_pool_size         | 1048576                |
| innodb_autoextend_increment             | 8                      |
| innodb_autoinc_lock_mode                | 1                      |
| innodb_buffer_pool_size                 | 8388608                |
| innodb_checksums                        | ON                     |
| innodb_commit_concurrency               | 0                      |
| innodb_concurrency_tickets              | 500                    |
| innodb_data_file_path                   | ibdata1:10M:autoextend |
| innodb_data_home_dir                    |                        |
| innodb_doublewrite                      | ON                     |
| innodb_fast_shutdown                    | 1                      |
| innodb_file_io_threads                  | 4                      |
| innodb_file_per_table                   | OFF                    |
| innodb_flush_log_at_trx_commit          | 1                      |
| innodb_flush_method                     |                        |
| innodb_force_recovery                   | 0                      |
| innodb_lock_wait_timeout                | 50                     |
| innodb_locks_unsafe_for_binlog          | OFF                    |
| innodb_log_buffer_size                  | 2097152                |
| innodb_log_file_size                    | 5242880                |
| innodb_log_files_in_group               | 2                      |
| innodb_log_group_home_dir               | ./                     |
| innodb_max_dirty_pages_pct              | 90                     |
| innodb_max_purge_lag                    | 0                      |
| innodb_mirrored_log_groups              | 1                      |
| innodb_open_files                       | 300                    |
| innodb_rollback_on_timeout              | OFF                    |
| innodb_stats_method                     | nulls_equal            |
| innodb_stats_on_metadata                | ON                     |
| innodb_support_xa                       | ON                     |
| innodb_sync_spin_loops                  | 20                     |
| innodb_table_locks                      | ON                     |
| innodb_thread_concurrency               | 8                      |
| innodb_thread_sleep_delay               | 10000                  |
| innodb_use_legacy_cardinality_algorithm | ON                     |

+ ----------------------------------------- + ------- ----------------- + 36 lignes en jeu (0,00 sec)

Je ne pouvais pas comprendre ce qui n'allait pas avec ça. Merci d'avance. Cordialement, UDAY

9
Uday

La raison est très simple. Lorsque vous insérez une ligne dans MyISAM, il la place simplement dans la mémoire du serveur et espère que le serveur la videra sur le disque à un moment donné dans le futur. Bonne chance si le serveur plante.

Lorsque vous insérez une ligne dans InnoDB, elle synchronise durablement la transaction sur le disque, ce qui l'oblige à attendre que le disque tourne. Faites le calcul sur votre système et voyez combien de temps cela prend.

Vous pouvez améliorer cela en relaxant innodb_flush_log_at_trx_commit ou en regroupant des lignes dans une transaction au lieu de faire une transaction par ligne.

Je recommande fortement de lire High Performance MySQL 3rd Edition (je suis l'auteur).

21
Baron Schwartz

InnoDB sera légèrement plus lent car il est conforme à ACID, a MVCC et fait des choses utiles comme vérifier les clés étrangères, etc.

Par exemple, le propre livre blanc d'Oracle pour MyISAM vs InnoDB ils disent en fait

Ces benchmarks ont été exécutés avec des contraintes ACID assouplies pour fournir une analyse plus comparable avec MyISAM ...

Un autre, de Percona " Devriez-vous passer de MyISAM à Innodb?" (mon gras)

Performance

... tandis que du côté des inconvénients, nous voyons une taille de table significativement grande (surtout si la taille des données est proche de la taille de la mémoire), écrit généralement plus lentement , blob plus lent gestion, problèmes de simultanéité, problèmes liés à un très grand nombre de tables, chargement lent des données et ALTER TABLE et autres. Un autre grand est COUNT (*) sans clause where, qui est souvent le stopper pour eux, se déplace jusqu'à ce qu'il soit résolu.

Vous ne pouvez pas comparer la vitesse d'écriture à données comparables ...

2
gbn

Lorsque vous utilisez InnoDB, vous avez un verrouillage au niveau de la ligne et dans MyISAM, vous avez un verrouillage au niveau de la table. Ce qui n'a pas de sens dans un benchmark avec seulement 1 connexion à la base de données. Mais si vous exécutez 100 scripts simulés pour les insérer, la différence sera évidente.

Gardez également à l'esprit qu'InnoDB stocke les données de manière phisique dans l'ordre de la clé primaire. S'il ne s'agit pas de l'incrémentation automatique et que les insertions produisent des valeurs aléatoires pour la clé primaire, vous atteindrez les limites d'E/S en raison d'écritures aléatoires. Cela est visible dans un benchmark lorsque la taille de la table est supérieure à celle du pool de mémoire tampon.

1
Maxim Krizhanovsky

MyISAM dans la plupart des cas, sera plus rapide que InnoDB pour exécuter le type de travail du moulin. La sélection, la mise à jour et l'insertion sont toutes très rapides dans des circonstances normales. InnoDB est plus strict dans l'intégrité des données tandis que MyISAM est lâche. MyISAM possède un index de recherche en texte intégral, contrairement à InnoDB.

Avantage de MyISAM:

  • Plus simple à concevoir et à créer, donc mieux pour les débutants. Pas de soucis sur les relations étrangères entre les tables.

  • Plus rapide qu'InnoDB dans son ensemble du fait de la structure plus simple donc beaucoup moins de coûts de ressources serveur. Indexation en texte intégral.

  • Particulièrement bon pour les tables à lecture intensive (sélection).

MySIAM Plus lent que InnoDB pour les tables qui sont fréquemment insérées ou mises à jour, car la table entière est verrouillée pour toute insertion ou mise à jour.

Avantages d'Innodb:

  • InnoDB doit être utilisé là où l'intégrité des données est une priorité car il en prend intrinsèquement soin à l'aide de contraintes relationnelles et de transactions.
  • Plus rapide dans les tableaux gourmands en écriture (insertions, mises à jour), car il utilise le verrouillage au niveau des lignes et ne retient que les modifications apportées à la même ligne qui est insérée ou mise à jour.

Conslusion: La comparaison est assez simple. InnoDB est plus adapté aux situations critiques de données qui nécessitent des insertions et des mises à jour fréquentes. MyISAM, d'autre part, fonctionne mieux avec des applications qui ne dépendent pas tout à fait de l'intégrité des données et qui sélectionnent et affichent principalement les données.

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

0
Mahesh Patil

Il existe des différences subtiles dans INDEXing entre les moteurs. Jusqu'à ce que vous vérifiiez cela, vous pouvez avoir des cas mystérieux où un moteur est plus rapide que l'autre - dans les deux sens. Même après avoir vérifié les index, il y aura des cas où l'un est plus rapide que l'autre. Cela couvre tous les cas que je connais: http://mysql.rjweb.org/doc.php/myisam2innodb

Un, comme d'autres l'ont dit, syntonise le moteur. Voir http://mysql.rjweb.org/doc.php/memory

0
Rick James