转载自: http://hiyijian.blog.163.com/blog/static/173086472201121621326471/

起因:有一个innoDB引擎的表Table,在一个大概3000次的foreach循环中执行

INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)

结果居然超出了60S的php执行限制(当然这个限制可以在php.ini中修改),让我很不解为何插入效率如此低下。

经过查找资料以及摸索,得到以下优化方法:

1、innoDB是mysql引擎中唯一支持事务transaction的引擎。默认所有用户行为都在事务内发生。
默认mysql建立新连接时,innoDB采用自动提交autocommit模式,每个SQL语句在它自己上形成一个单独的事务,即insert一次就commit了一次,InnoDB在该事务提交时必须刷新日志到磁盘,因此效率受限于磁盘读写效率。
你可以通过

mysql_query("SET AUTOCOMMIT = 0");

来关闭自动提交模式。

如果自动提交模式被关闭,那么我们可以认为一个用户总是有一个事务打开着。一个SQL COMMIT或ROLLBACK语句结束当前事务并且一个新事务开始。两个语句都释放所有在当前事务中被设置的InnoDB锁定。一个COMMIT语句意味着在当前事务中做的改变被生成为永久的,并且变成其它用户可见的。一个ROLLBACK语句,在另一方面,撤销所有当前事务做的修改。
当然如果是自动提交模式,通过用明确的START TRANSACTION或BEGIN语句来开始一个事务,并用COMMIT或者ROLLBACK语句来结束它,这样用户仍旧可以执行一个多重语句事务。

2、因此对于本例,在建立数据库连接后,立即关闭自动提交,在foreach循环结束后,一次commit即可,效率大大提升。

mysql_query("SET AUTOCOMMIT = 0");
foreach(***)
  INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)
mysql_query("commit");

3、对于多次insert行到同一表的需求,你还可以采用多行插入语法来减少客户端和服务器之间的通讯开支。

INSERT INTO Table(columnA, columnB) VALUES (1,2), (5,5), (3,3), ...

4、如果你的表有索引,索引会拖慢insert速度。大量插入数据时,可以先关闭索引,然后再重建索引。

ALTER TABLE Table DISABLE KEYS;
INSERT INTO ***;
ALTER TABLE Table ENABLE KEYS;

[转]MySQL innoDB数据插入性能优化相关推荐

  1. 数据库:MySQL大批量SQL插入性能优化

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

  2. 分布式实时分析数据库citus数据插入性能优化

    前言 从可靠性和使用便利性来讲单机RDBMS完胜N多各类数据库,但当数据量到了一定量之后,又不得不寻求分布式,列存储等等解决方案.citus是基于PostgreSQL的分布式实时分析解决方案,由于其只 ...

  3. MySQL批量SQL插入性能优化

    注意事项: 1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M. 2. 事务需要控 ...

  4. A表取数据处理后插入B表,Mysql大数据插入,优化过程

    情景:A表中有20万条数据,取出处理,然后插入B表. 第一版:分页取出,组成sql语句.批量插入数据 $tempData = $this->model->page($page,'1000' ...

  5. mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  6. 关于若干数据库数据插入性能的对比

    前几天,苦恼于到底使用哪一种本地数据库来存储部分数据,于是决定做一个数据插入测试进行求证.       本地数据库接触不多,最早用过Access,但现在SQLite功能更加强大--而且,说实在的我不喜 ...

  7. Mysql+innodb数据存储逻辑

    Mysql+innodb数据存储逻辑. 表空间由段,区,页组成 ibdata1:共享表空间.即所有的数据都存放在这个表空间内.如果用户启用了innodb_file_per_table,则每张表内的数据 ...

  8. 读薄《高性能MySql》(四)查询性能优化

    读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...

  9. 【性能优化】MySQL 数据库连接原理和性能优化 - 学习/实践

    1.应用场景 学习MySQL数据库连接原理和性能优化, 开发高性能程序. 2.学习/操作 1. 文档阅读 MySQL 数据库连接原理和性能优化 - 高性能 MySQL 实战 | Laravel 学院 ...

最新文章

  1. 【微服务】Spring-Boot整合Consul (自定义服务配置及健康检查)
  2. java面试常问问题(中级及以下工程师)
  3. 推荐7款实用强大的国产windows软件,你值得拥有!
  4. 独家 | 手把手教你用R语言做回归后的残差分析(附代码)
  5. python列表解析
  6. BWA SAM文件格式
  7. 利用API实现窗体淡入淡出特效
  8. 面试 4 个月,最终入职大厂经验分享!
  9. HDFS QJM机制分析
  10. 拳王虚拟项目公社:自动化的虚拟资源产品,唱歌教程赚地盆满钵满
  11. win python 怎么打开建立一个孤立的进程_python实现在windows服务中新建进程的方法...
  12. org.eclipse.e4.core.di.InjectionException:org.eclipse.swt.SWTException: Widget is disposed
  13. 用例驱动的需求过程实践
  14. Windows程序设计_Chap03_窗口与消息_学习笔记
  15. Springer期刊参考文献格式如何用Latex生成
  16. 【人脸质量评估】SDD-FIQA基于人脸相似度分布距离的无监督质量评估方法
  17. keil5打开keil4工程无法下载程序
  18. 浅析javaIO的原理过程
  19. Matlab数据拟合-----使用polyfit 和polyval函数
  20. 数据管理平台DMP细致研究——BlueKai

热门文章

  1. Java多线程复习:2(线程的创建和使用)
  2. java 彩票系统_JAVA版彩票随机生成系统
  3. jQuery中的页面载入($()、ready(fn)、onload)
  4. 如何用eclipse操作MySQL数据库进行增删改查?
  5. yii1框架,事务使用方法
  6. 第36章 网络管理
  7. python之XML文件解析
  8. 通讯组基本管理任务一
  9. html5知识点补充—hgroup元素的使用
  10. 利用apache+svn+jenkins+maven 实现java环境的自动化构建和部署(三)(网内首发超详细版)...