MySQL插入数据很慢优化思路
解决方法与思路
-
插入数据量非常大的场景
加大mysql配置中的bulk_insert_buffer_size,这个参数默认为8M
bulk_insert_buffer_size=100M
修改该条记录有助于千万级别数据批量插入。 -
如果只是单纯避免业务侧阻塞
改写所有insert语句为insert delayed
这个insert delayed不同之处在于:立即返回结果,后台进行处理插入。 -
锁方面的排查
业务侧阻塞排查:
查询是否是因为线程长期获取不到某个锁导致
是否某个线程在进行某些定时任务在拉数据什么的。
数据库侧阻塞排查:
查询是否因为某个操作加了表锁
是否有某个操作锁了整个表等 -
优化索引,是否因为主键无序且长度过长,导致插入的时候维护B+树太慢
产生了各种页分裂等问题 -
还有一种场景导致插入很慢:
https://blog.csdn.net/xiaolyuh123/article/details/78793626
https://blog.csdn.net/coco3600/article/details/100232009?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
与MySQL日志有关,排查binlog日志是否太大,导致进行操作写入新的biglog时需要太长的时间
这种方式可以通过三个手段解决:
备份过去太大的binlog日志,重新生成新的binlog
调整biglog的最大值
极端一点:设置表属性以及索引属性为nologing属性,但是面临数据丢失的风险,没有log记录就无法找回 -