在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

MySQL批量SQL插入的性能优化示例

118次阅读
没有评论

共计 2314 个字符,预计需要花费 6 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下 MySQL 批量 SQL 插入的性能优化示例,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。

一条 SQL 语句插入多条数据

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
 VALUES (0 ,  userid_0 ,  content_0 , 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
 VALUES (1 ,  userid_1 ,  content_1 , 1);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
 VALUES (0 ,  userid_0 ,  content_0 , 0), (1 ,  userid_1 ,  content_1 , 1);

第二种 SQL 执行效率高的主要原因是合并后日志量 [mysql 的 binlog 和 InnoDB 的事务让日志] 减少了,降低日志刷盘的数据量和频率,从而提高效率。

通过合并 SQL 语句,同时也能减少 SQL 语句解析的次数,减少网络传输的 IO。

测试对比数据,分别是单条数据的导入与转换成一条 SQL 语句进行导入。
MySQL 批量 SQL 插入的性能优化示例

在事务中进行插入处理

START TRANSACTION;INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (0 ,  userid_0 ,  content_0 , 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (1 ,  userid_1 ,  content_1 , 1);...COMMIT;

使用事务可以提高数据的插入效率,这是因为进行一个 insert 操作时,MySQL 内部都会建立一个事务,在事务内才进行真正插入处理操作。

通过使用事务减少创建事务的消耗,所有插入都在执行后才进行提交操作

测试对比数据,分笔试不适用事务和使用事务操作

MySQL 批量 SQL 插入的性能优化示例

数据有序插入

数据有序的插入是插入记录在主键上的有序排序

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (1 ,  userid_1 ,  content_1 , 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (0 ,  userid_0 ,  content_0 , 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (2 ,  userid_2 ,  content_2 ,2);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (0 ,  userid_0 ,  content_0 , 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (1 ,  userid_1 ,  content_1 , 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES (2 ,  userid_2 ,  content_2 ,2);

由于数据库插入时,需要维护索引数据,无需的记录会增大维护索引的成本。

参照 InnoDB 使用的 B +tree 索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较少;如果插入的记录在索引中间,需要 B +tree 进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

测试对比数据,随机数据与顺序数据的性能对比

MySQL 批量 SQL 插入的性能优化示例

先删除索引,插入完成后重建索引

性能综合测试

MySQL 批量 SQL 插入的性能优化示例

合并数据 + 事务的方法在较少数据量时,性能提升很明显,数据量较大时,性能急剧下降,这是由于此时数据量超过了 innodb_buffer 的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。

合并数据 + 事务 + 有序的方法在数据量达到千万级以上表现依然良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,可以维持较高

注意事项

SQL 语句是有长度限制,在进行数据合并在同一 SQL 中务必不能超过 SQL 长度限制,通过 max_allowed_packet 配置可以修改,默认 1M,测试时可以修改为 8M。

事务需要控制大小,事物太大可能影响执行的效率。MySQL 有 innodb_log_buffer_size 配置项,超过这个值会把 innodb 的数据刷到磁盘中,这时,效率会有所下降。所以较好的做法是,在数据达到这个值前执行事务提交。

看完了这篇文章,相信你对 MySQL 批量 SQL 插入的性能优化示例有了一定的了解,想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-07发表,共计2314字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 国产精品久久久午夜夜伦鲁鲁 | 亚洲日产韩国一二三四区 | 国产一区二区三区在线免费观看 | 伊人久久精品一区二区三区 | 亚洲成a人在线看天堂无码 亚洲成本人网亚洲视频大全 | 俄罗斯美女真人性做爰 | 微拍秒拍99福利精品小视频 | 欧美a级毛毛片免费视频试播 | 国产精品偷伦视频免费手机播放 | 欧美成人全部视频 | 91麻豆精品国产91久久久久 | 国产免费一区二区三区免费视频 | 91亚洲国产成人久久精品网址 | 久久久久久伊人高潮影院 | 日本一级毛片视频在线看 | 国内视频在线 | 韩国特黄毛片一级毛片免费 | 狠狠做深爱婷婷久久综合一区 | 久久影视在线观看 | 成人性生交片无码免费看 | 免费级毛片| 天堂资源www天堂在线 | 免费网站成人亚洲 | 毛片免费看 | 大桥未久在线精品视频在线 | 91精品国产综合久久精品 | 欧美+日本+国产+在线观看 | 天天干夜夜 | 性欧美一级毛片 | 三级在线观看网站 | 一边啪啪一边呻吟av夜夜嗨 | 国内精品久久久久影院一蜜桃 | 亚洲日韩亚洲另类激情文学 | 亚洲亚洲人成综合网络 | 国产午夜亚洲精品久久www | 欧美日韩中文在线 | 日本黄色大片免费看 | 美女被啪到哭网站在线观看 | 久久99精品久久久久久园产越南 | 中文字幕欧美日韩久久 | 免费观看欧美一区二区三区 |