mar*_*ark 58 mysql performance innodb
我目前正致力于创建一个测试应用程序性能的环境; 我正在使用MySQL和InnoDB进行测试,以找出哪些可以为我们提供最佳服务.在此环境中,我们将自动准备数据库(加载现有转储)并检测我们的测试工具.
我准备用MySQL和InnoDB测试相同的数据转储,但我已经无法将初始导入带到InnoDB部分的可用速度.最初的转储需要更长时间,但这并不关心我:
$ for i in testdb_myisam testdb_innodb; do time mysqldump --extended-insert $i > $i.sql; done
real 0m38.152s
user 0m8.381s
sys 0m2.612s
real 1m16.665s
user 0m6.600s
sys 0m2.552s
Run Code Online (Sandbox Code Playgroud)
但是,导入时间差异很大:
$ for i in testdb_myisam testdb_innodb; do time mysql $i < $i.sql; done
real 2m52.821s
user 0m10.505s
sys 0m1.252s
real 87m36.586s
user 0m10.637s
sys 0m1.208s
Run Code Online (Sandbox Code Playgroud)
经过研究,我来了将表从MyISAM更改为InnoDB使系统变慢然后使用set global innodb_flush_log_at_trx_commit=2:
$ time mysql testdb_innodb < testdb_innodb.sql
real 64m8.348s
user 0m10.533s
sys 0m1.152s
Run Code Online (Sandbox Code Playgroud)
恕我直言仍然令人震惊的缓慢 我也禁用log_bin了这些测试,这里是所有mysql变量的列表.
我是否要接受这个长时间的InnoDB,还是可以改进它们?我完全可以控制这个MySQL服务器,因为它纯粹适用于这个测试环境.
我可以仅为初始导入应用特殊配置,并将其更改回应用程序测试,以便更好地匹配生产环境.
更新:
鉴于反馈,我已禁用自动提交和各种检查:
$ time ( echo "SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;" \
; cat testdb_innodb.sql ; echo "COMMIT;" ) | mysql testdb_innodb;date
real 47m59.019s
user 0m10.665s
sys 0m2.896s
Run Code Online (Sandbox Code Playgroud)
速度提高了,但没有那么多.我的测试有缺陷吗?
更新2:
我能够访问不同的机器进口只需要大约8分钟.我比较了配置并将以下设置应用于我的MySQL安装:
innodb_additional_mem_pool_size = 20971520
innodb_buffer_pool_size = 536870912
innodb_file_per_table
innodb_log_buffer_size = 8388608
join_buffer_size = 67104768
max_allowed_packet = 5241856
max_binlog_size = 1073741824
max_heap_table_size = 41943040
query_cache_limit = 10485760
query_cache_size = 157286400
read_buffer_size = 20967424
sort_buffer_size = 67108856
table_cache = 256
thread_cache_size = 128
thread_stack = 327680
tmp_table_size = 41943040
Run Code Online (Sandbox Code Playgroud)
有了这些设置,我现在已经下降到大约25分钟.距离MyISAM的几分钟还有一段距离,但它对我来说更有用.
Pas*_*ent 131
你尝试的 大容量数据加载提示从InnoDB的性能优化提示(特别是第一个):
导入数据时
InnoDB,请确保MySQL没有启用自动提交模式,因为每次插入都需要将日志刷新到磁盘.要在导入操作期间禁用自动提交,请使用SET autocommit和COMMIT语句将其括起来:Run Code Online (Sandbox Code Playgroud)SET autocommit=0; ... SQL import statements ... COMMIT;如果使用mysqldump选项
--opt,则会获得快速导入到InnoDB表中的转储文件,即使不使用SET autocommit和COMMIT语句包装它们也是如此 .如果您
UNIQUE对辅助密钥有约束,则可以通过在导入会话期间临时关闭唯一性检查来加速表导入:Run Code Online (Sandbox Code Playgroud)SET unique_checks=0; ... SQL import statements ... SET unique_checks=1;对于大表,这会节省大量磁盘I/O,因为
InnoDB可以使用其插入缓冲区批量写入二级索引记录.确保数据不包含重复键.如果
FOREIGN KEY表中有约束,则可以通过在导入会话期间关闭外键检查来加快表导入:Run Code Online (Sandbox Code Playgroud)SET foreign_key_checks=0; ... SQL import statements ... SET foreign_key_checks=1;对于大表,这可以节省大量磁盘I/O.
IMO,整章都值得一读.