插入分析php
MySQL中插入一个记录须要的时间由下列因素组成,其中的数字表示大约比例:html
若是咱们每插入一条都执行一个SQL语句,那么咱们须要执行除了链接和关闭以外的全部步骤N次,这样是很是耗时的,优化的方式有一下几种:mysql
每种方式执行的性能以下。sql
Innodb引擎数据库
InnoDB 给 MySQL 提供了具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level)以及外键约束(FOREIGN KEY constraints)。apache
InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中创建其专用的缓冲池用于高速缓冲数据和索引。安全
测试环境服务器
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16框架
总数100W条数据性能
插入完后数据库大小38.6MB(无索引),46.8(有索引)
MyIASM引擎
MyISAM 是MySQL缺省存贮引擎。设计简单,支持全文搜索。
测试环境
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16
总数100W条数据
插入完后数据库大小19.1MB(无索引),38.6(有索引)
总结
我测试的数据量不是很大,不过能够大概了解这几种插入方式对于速度的影响,最快的必然是Load Data方式。这种方式相对比较麻烦,由于涉及到了写文件,可是能够兼顾内存和速度。
引用:http://www.codeceo.com/article/mysql-insert-compare.html
2、PHP+MySQL百万数据插入
第一种方法:使用insert into 插入,代码以下:
最后显示为:23:25:05 01:32:05 也就是花了2个小时多! 这是时间撸几把 都行。。。
第二种方法:使用事务提交,批量插入数据库(每隔10W条提交下)
最后显示消耗的时间为:22:56:13 23:04:00 ,一共8分13秒 ,代码以下:
时间是一下缩短很多但仍是有点长。
第三种方法:使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()而后再一次性插入,若是字符串太长,
则须要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 2*1024*1024*10;消耗时间为:11:24:06 11:24:11;
我擦 插入200W条测试数据仅仅用了不到6秒钟!代码以下:
可能这里又会有人说数据不大 sql文件导出来也是小200M 5秒钟 对一表格 进行200万条数据 速度已经不错了。
这个再跟你们说一个 TP框架了的 addall方法
速度也很快 可是还不如原生。
着了说一下其中可能会遇到的问题 好比试验时可能会出现PHP内存限制 和mysql的SQL语句溢出甚至宕机
这里数几个方案
一、能够进行相关的配置php.ini my.ini 等
二、你们能够用队列进行分批处理
三、或者本身的一些方法