Mysql:插入性能 INNODB vs MYISAM

Uda*_*day 9 mysql innodb myisam performance insert

我正在插入一个具有 5 个属性和 1000 行的简单小表。

我观察到当引擎是 INNODB 时,每个插入需要 0.03 - 0.05 秒。我将引擎更改为 MYISAM,然后插入速度更快。它需要 0.001 - 0.003。

问题是什么。默认情况下 innodb_flush_log_trx_commit = 1。我就是这个设置。这是我的 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)
Run Code Online (Sandbox Code Playgroud)

变量

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                     |
Run Code Online (Sandbox Code Playgroud)

+-----------------------------------------+------- -----------------+ 36 行(0.00 秒)

我无法弄清楚这出了什么问题。提前致谢。问候, UDAY

小智 21

原因很简单。当您在 MyISAM 中插入一行时,它只是将其放入服务器的内存中,并希望服务器在将来的某个时候将其刷新到磁盘。如果服务器崩溃,祝你好运。

当您在 InnoDB 中插入一行时,它会将事务持久地同步到磁盘,这需要它等待磁盘旋转。在您的系统上进行数学计算,看看需要多长时间。

您可以通过放宽 innodb_flush_log_at_trx_commit 或通过在事务中批处理行而不是每行执行一个事务来改进这一点。

我强烈推荐阅读 High Performance MySQL 3rd Edition(我是作者)。


gbn*_*gbn 2

InnoDB 会稍微慢一些,因为它符合 ACID,具有 MVCC 并执行有用的操作,例如实际检查外键等。

举个例子,Oracle自己的MyISAM vs InnoDB白皮书他们实际上说

这些基准测试在宽松的 ACID 约束下运行,以提供与 MyISAM 更具可比性的分析...

另一个来自 Percona 的“你应该从 MyISAM 迁移到 Innodb 吗?” (我的大胆)

表现

...而在缺点方面,我们看到表大小非常大(特别是当数据大小接近内存大小时),通常写入速度较慢,blob 处理速度较慢,并发问题,处理大量表的问题,数据加载缓慢以及更改表等。另一个大问题是没有 where 子句的 COUNT(*) ,这通常是它们移动的阻碍,直到它被解决为止。

您无法比较同类写入速度......