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(我是作者)。
InnoDB 会稍微慢一些,因为它符合 ACID,具有 MVCC 并执行有用的操作,例如实际检查外键等。
举个例子,Oracle自己的MyISAM vs InnoDB白皮书他们实际上说
这些基准测试在宽松的 ACID 约束下运行,以提供与 MyISAM 更具可比性的分析...
另一个来自 Percona 的“你应该从 MyISAM 迁移到 Innodb 吗?” (我的大胆)
表现
...而在缺点方面,我们看到表大小非常大(特别是当数据大小接近内存大小时),通常写入速度较慢,blob 处理速度较慢,并发问题,处理大量表的问题,数据加载缓慢以及更改表等。另一个大问题是没有 where 子句的 COUNT(*) ,这通常是它们移动的阻碍,直到它被解决为止。
您无法比较同类写入速度......