`
kavy
  • 浏览: 866164 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL innoDB insert into性能优化

 
阅读更多
起因:有一个innoDB引擎的表Table,在一个大概3000次的foreach循环中执行 INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB),结果居然超出了60S的php执行限制(当然这个限制可以在php.ini中修改),这是因为innoDB是mysql存储引擎中唯一支持事务的,默认所有用户的行为都在事务内发生。
默认mysql建立新连接时,innoDB采用自动提交autocommit模式,每个SQL语句在它自己上形成一个单独的事务,即insert一次就commit了一次,InnoDB在该事务提交时必须刷新日志到磁盘,因此效率受限于磁盘读写效率。
你可以通过 mysql_query("SET AUTOCOMMIT = 0"); 来关闭自动提交模式。
如果自动提交模式被关闭,那么我们可以认为一个用户总是有一个事务打开着。一个SQL COMMIT或ROLLBACK语句结束当前事务并且一个新事务开始。两个语句都释放所有在当前事务中被设置的InnoDB锁定。一个COMMIT语句意味着在当前事务中做的改变被生成为永久的,并且变成其它用户可见的。一个ROLLBACK语句,在另一方面,撤销所有当前事务做的修改。
当然如果是自动提交模式,通过用明确的START TRANSACTION或BEGIN语句来开始一个事务,并用COMMIT或者ROLLBACK语句来结束它,这样用户仍旧可以执行一个多重语句事务。

对于本例,在建立数据库连接后,立即关闭自动提交,在foreach循环结束后,一次commit即可,效率将大大提升。
mysql_query("SET AUTOCOMMIT = 0");
foreach(***)
  INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)
mysql_query("commit");

对于多次insert行到同一表的需求,你还可以采用多行插入语法来减少客户端和服务器之间的通讯开支。即:
INSERT INTO Table(columnA, columnB) VALUES (1,2), (5,5), (3,3), ...

如果你的表有索引,索引也会拖慢insert速度。大量插入数据时,可以先关闭索引,然后再重建索引。
ALTER TABLE Table DISABLE KEYS;
INSERT INTO ***;
ALTER TABLE Table ENABLE KEYS;
分享到:
评论

相关推荐

    MySQL批量SQL插入性能优化详解

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) ...

    MySQL实现批量插入以优化性能的教程

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如:   INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `...

    MySQL批量SQL插入性能优化

     经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。  1. 一条SQL语句插入多条数据。  常用的插入语句如:  INSERT INTO `insert_table` (`datetime`, `uid`, `...

    MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用...insert into m11 values (1,1,1,1),(2,2,2,2),(3,3

    关于MySQL innodb_autoinc_lock_mode介绍

    innodb_autoinc_lock_mode这个参数控制着在向有auto_increment 列的表插入数据时,相关锁的行为; 通过对它的设置可以达到性能与安全(主从的数据一致性)的平衡 【0】我们先对insert做一下分类 首先insert大致上可以...

    MySQL中insert语句的使用与优化教程

    MySQL 表中使用 INSERT INTO SQL语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT ...

    mysql之innodb的锁分类介绍

    一、innodb行锁分类 record lock:记录锁,也就是仅仅锁着单独的一行 gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值。 next-key lock:record lock+gap ... INSERT INTO … VAL

    中国城市表-详细到村级别-五级

    -- ---------------------------- -- Table structure for xdr_regions -- ---------------------------- DROP TABLE IF EXISTS `xdr_regions`; CREATE TABLE `xdr_regions` ( ...INSERT INTO `xdr_regions` VALUES ...

    area_insert_quanguo.sql

    INSERT INTO `area` VALUES (110100000000, '市辖区', 110000000000, 2); INSERT INTO `area` VALUES (110101000000, '东城区', 110100000000, 3); INSERT INTO `area` VALUES (110101001000, '东华门街道办事处', ...

    mysql 中国城市区号

    INSERT INTO `city` VALUES ('1', '北京', '北京', '010'); INSERT INTO `city` VALUES ('2', '天津', '天津', '022'); INSERT INTO `city` VALUES ('3', '河北', '石家庄', '0311'); INSERT INTO `city` VALUES ('4...

    国家行业分类数据库mysql版本

    INSERT INTO `industrys` VALUES ('2', '食品、饮料', '0', null, null, null); INSERT INTO `industrys` VALUES ('3', '服装', '0', null, null, null); INSERT INTO `industrys` VALUES ('4', '纺织、皮革', '0', ...

    MySQL Innodb表导致死锁日志情况分析与归纳

    两个sql语句如下:(1)insert into backup_table select * from source_table(2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<‘$daysago_1week’teamUser表的表结构如下:...

    最新省市区县数据库

    最新省市区县数据库 DROP TABLE IF EXISTS `area`; CREATE TABLE `area` ( `codeid` varchar(20) ...INSERT INTO `area` VALUES ('11', '0', '北京'); INSERT INTO `area` VALUES ('1101', '11', '北京市辖'); ......

    从国家统计局抓取的地图省市区划代码和城划分代码(最新2020/06/03)

    INSERT INTO `area` VALUES ('110100000000','市辖区','110000000000',NULL,0); INSERT INTO `area` VALUES ('110101000000','东城区','110100000000',NULL,0); INSERT INTO `area` VALUES ('110101001000','东华门...

    python测试mysql写入性能完整实例

    本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下。 测试环境: (1) 阿里云服务器centos 6.5 ... sql = insert into stu(name,age,class)values('test mysql insert'

    Industry_upload.sql

    INSERT INTO `industry` VALUES ('A', '农、林、牧、渔业', null, '0'); INSERT INTO `industry` VALUES ('01', '农业', 'A', '1'); INSERT INTO `industry` VALUES ('011', '谷物种植', '01', '2'); INSERT INTO `...

    SSH_spring4.2_hibernate5完整示例代码

    INSERT INTO `person` VALUES ('12', '测试数据0'); INSERT INTO `person` VALUES ('13', '测试数据1'); INSERT INTO `person` VALUES ('14', '测试数据2'); INSERT INTO `person` VALUES ('15', '测试数据3'); ...

    mysql 全国地区数据库表 五级数据库 村级地区表

    CREATE TABLE `region` ( `id` mediumint(7) unsigned NOT...INSERT INTO `region` VALUES (3, 2, 110100000000, 110101000000, 100000, '010', '东城区', '东城', '北京,东城', 'DongCheng', 116.416357, 39.928353);

    最新县及县以上行政区划代码(截止2016年7月31日)

    INSERT INTO `feng_area` VALUES ('1', '110000', '北京市', '110000', '1'); INSERT INTO `feng_area` VALUES ('2', '110100', '市辖区', '110000', '2'); INSERT INTO `feng_area` VALUES ('3', '110101', '东城区...

    MySQL中Order By多字段排序规则代码示例

    说在前面 突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧。 MySql order by 单字段 建一测试表如下: ...CREATE TABLE `a` ( `code` varchar(255) ...INSERT into a

Global site tag (gtag.js) - Google Analytics