当前位置: 首页 > 科技观察

大数据量下MySQL插入方式性能对比_0

时间:2023-03-18 18:13:55 科技观察

无论是日常业务数据处理还是数据库导入导出,都可能会遇到需要处理大量数据的插入。插入方式和数据库引擎都会影响插入速度。本文旨在从理论和实践上对各种插入方式进行分析比较,以方便日后应用中插入方式的选择。插入分析MySQL插入一条记录所需的时间由以下因素组成,其中数字代表大致比例:连接:(3)向服务器发送查询:(2)分析查询:(2)插入记录:(1x记录size)InsertIndex:(1xindex)Closing:(1)如果我们每次insert都执行一条SQL语句,那么我们需要执行N次除连接和关闭之外的所有步骤,非常耗时,有一些方法优化它的几种类型:在每个insert语句中写入多行,将所有查询语句批量插入到一个事务中,使用LoadData导入数据。每种方法的性能如下。Innodb引擎InnoDB为MySQL提供了具有提交、回滚和崩溃恢复功能的事务安全(符合ACID)表。InnoDB提供了行锁(lockingonrowlevel)和外键约束(FOREIGNKEYconstraints)。InnoDB是为处理大容量数据库系统而设计的,其CPU利用率是其他基于磁盘的关系数据库引擎无法比拟的。从技术上讲,InnoDB是一个完整的置于MySQL后台的数据库系统。InnoDB在主内存中构建了它的专用缓冲池,用于缓存数据和索引。测试环境MacbookAir12midapache2.2.26php5.5.10mysql5.6.16总共插入100W条数据数据库大小为38.6MB(无索引),46.8(有索引)无索引单次insert总耗时:229sPeak内存:246KBwithindex单次插入总时间:242s峰值内存:246KB无索引批量插入总时间:10s峰值内存:8643KB有索引批量插入总时间:16s峰值内存:8643KB无索引事务总时间:78s峰值内存:246KB带索引事务的总插入时间:82s峰值内存:246KB无索引加载数据的总插入时间:12s峰值内存:246KB带索引加载数据的总插入时间:11s峰值内存:246KBMyIASM引擎MyISAM是默认存储引擎MySQL的。设计简洁,支持全文搜索。测试环境MacbookAir12midapache2.2.26php5.5.10mysql5.6.16总共插入100W条数据数据库大小19.1MB(无索引),38.6(有索引)无索引单次插入总耗时:82s内存峰值:246KBwithindex单次insert总耗时:86sPeakmemory:246KB无indexbatchinsert总耗时:3sPeakmemory:8643KBbatchinsertwithindex总耗时:7sPeakmemory:8643KBloaddata无index总耗时:6sPeakmemory:246KBwithindexLoadDatatotalinsertiontime:8sPeakmemory:246KBSummary我测试的数据量不是很大,但是你可以大致了解这几种插入方式对速度的影响,最快的肯定是LoadData方法。这种方法比较麻烦,因为涉及到写文件,但是可以兼顾内存和速度。测试代码true));//删除最后插入的数据$db->query('deletefrom`test`');//开始计时$start_time=time();$sum=1000000;//测试选项$num=1;if($num==1){//单次插入for($i=0;$i<$sum;$i++){$db->query("insertinto`test`(`id`,`name`)values($i,'tsetssdf')");}}elseif($num==2){//批量插入,为了不超过max_allowed_pa??cket,选择每10万插入一次for($i=0;$i<$sum;$i++){if($i==$sum-1){//***一次if($i%100000==0){$values="($i,'testtest')";$db->query("insertinto`test`(`id`,`name`)values$values");}else{$values.=",($i,'testtest')";$db->query("insertinto`test`(`id`,`name`)values$values");}break;}if($i%100000==0){//一般插入if($i==0){$valuesonlyinthiscase="($i,'testtest')";}else{$db->query("插入`test`(`id`,`name`)values$values");$values="($i,'testtest')";}}else{$values.=",($i,'testtest')";}}}elseif($num==3){//事务插入$db->beginTransaction();for($i=0;$i<$sum;$i++){$db->query("insertinto`test`(`id`,`name`)values($i,'tsetssdf')");}$db->commit();}elseif($num==4){//fileloaddata$filename=dirname(__FILE__).'/test.sql';$fp=fopen($filename,'w');for($i=0;$i<$sum;$i++){fputs($fp,"$i,'testtest'\r\n");}$db->e??xec("loaddatainfile'$filename'intotabletestfieldsterminatedby','");}$end_time=time();echo"总花费时间",($end_time-$start_time),"seconds\n";echo"peakmemory",round(memory_get_peak_usage()/1000),"KB\n";?>以上是MySQL大量插入数据的各种方式的性能分析比较。我希望它可以帮助你。来源:http://yansu.org/2014/04/16/insert-large-number-of-data-in-mysql.html