MySQL插入性能优化

2023-06-04 0 439

能从如下表所示两个各方面强化MySQL的填入操控性。

代码强化values 数个

即堆叠成两个insert values sql, 比如

INSERT INTO MyTable

( Column1, Column2, Column3 )

VALUES

(John, 123, Lloyds Office),

(Jane, 124, Lloyds Office),

(Billy, 125, London Office),

(Miranda, 126, Bristol Office);

两个外交事务

迈入两个外交事务,大批量操作方式完了才递交外交事务,而并非,操作方式一场就递交一场,这种io太高,填入很慢。

填入表头尽可能避免,尽可能用缺省

小常识: max_allowed_packet 预设是1M,怎样insert values sql 太大须要下调那个值

停用 unique_checks

强化效用并非很显著,上面截屏 Lizier 《MySQL 资料库合作开发、优化与管理工作保护 第2版》书刊

bulk_insert_buffer_size

那个参数只能对 MyISAM使用,innodb无效

配置强化innodb_buffer_pool_size 缓冲区配置什么是 innodb_buffer_pool_size

MySQL 缓存表数据,索引数据的地方。增加它的值能减少 磁盘 io ,提升 读写操控性。提升读的原理:因为 buffer_pool_size 设置的比较大, 很多表数据和索引已缓存到 buffer pool , 要查询的数据在缓存中找到了,就不须要访问磁盘了。读操控性就得到了提升。提升写的原理:因为 buffer_pool_size 设置的比较大, 写的数据,暂时以脏页的方式放在内存,然后慢慢落到磁盘,如果buffer_pool_size 太小就没办法缓存写操作方式,写一场访问一场磁盘 ,写入操控性就比较慢。(实际自测增大buffer_pool_size后,并未带来纯写操作方式的操控性提升, 这块有待进一步研究)

设置多大的 innodb_buffer_pool_size 合适?

通常将innodb_buffer_pool_size其配置为物理内存的50%到75%

相关参数设置

innodb_buffer_pool_instances

一般将 innodb_buffer_pool_size 值增大后,须要增加配置 innodb_buffer_pool_instances 的值。

innodb_buffer_pool_instances 是 buffer_pool 实例数量,预设为1。增加它的值,能减少资料库内部的资源竞争,增加并发处理能力。

怎样设置innodb_buffer_pool_instances?innodb_buffer_pool_instances 的范围是 1 (the default) up to 64 (the maximum). 能将 innodb_buffer_pool_instances 的个数设置为 buffer pool size 的 十分之一, 比如 innodb_buffer_pool_size 是 30g ,那 innodb_buffer_pool_instances 就设置为 3;

innodb_buffer_pool_size 小常识

因为有额外内存的使用,如果指定 innodb_buffer_pool_size 为 12g 实际占用内存可能是 14g +

外交事务日志配置innodb_log_file_size

缺省 48MB设置的太小:比如用缺省48MB,当两个日志文件写满后,innodb会自动切换到另外两个日志文件,而且会触发资料库的检查点(Checkpoint),这会导致innodb缓存脏页的小大批量刷新,会显著降低innodb的操控性。

设置的太大:设置很大以后减少了checkpoint,并且由于redo log是顺序I/O,大大提高了I/O操控性。但是如果资料库意外出现了问题,比如意外宕机,那么须要重放日志并且恢复已经递交的外交事务,如果日志很大,那么将会导致恢复时间很长。甚至到我们不能接受的程度。

总结:innodb_log_file_size设置得太小无法释放资料库操控性,设置得太大,会增加宕机后日志重放恢复的时间。

innodb_log_files_in_group

重做日志组中的日志数量,缺省是2 ,一般用缺省也能。

innodb_log_buffer_size

将日志写入磁盘日志文件前的缓冲大小,缺省 8MB,一般用缺省也能。

读写线程增加

合理增加 innodb_write_io_threads,innodb_read_io_threads 两个配置的值即可。

实践比较

环境:centos 7, MySQL 6.7 , 8G,i5 操作方式:jmeter 64个并发填入数据,每个并发填入320条数据,每条数据填入前都会随机查询一场资料库。

强化前的配置

innodb_buffer_pool_size = 134217728 //128MB

innodb_buffer_pool_instances = 1

强化后的配置

innodb_buffer_pool_size = 1G

innodb_buffer_pool_instances = 1

操控性结果buffer_pool_size 128MB:耗时58s buffer_pool_size 1GB:耗时172s

结论

buffer pool 缓冲区增加8倍内存, 换来 3 倍 读操控性提升,3 倍 含读的写操控性提升(含读的写,指的是在insert 前,进行了资料库查询,将查得的数据赋值给了 insert 表头), 对于纯写几乎没有操控性提升。同理,如果缓冲区增加5.3倍内存,理论能提升2倍操控性提升。

硬件强化

最影响资料库操控性的是磁盘 io,上 ssd 能大大提升操控性,其次是 cpu,内存 。

架构强化

读写分离,降低单机io的压力。

MySQL插入性能优化

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务