一直以来各种人都在争论mysql的插入性能,当然我这里说的人大部分是phper,使用的场景也是php操作mysql,有人说一秒怎么也要几万,有的说几千,还有的说几百。有的也的确是实验过,但是,其实,所有的结果都是因为有前置条件的。我这里就实际操作了一下。对比了一下,php操作mysql,在有索引,无索引,innodb开启事务、和不使用事务,以及mysql load data infile几种方式的对比。

有人说实践出真知,的确,我们不能完全相信书上,尤其是网上说的,应该自己实践一下,但是,即使自己真的动手实践,也可能因为自己知识面的原因,得出的结果可能是固定场景下的。先交代一下我的前提吧,我用的自己的电脑,戴尔笔记本,i5 2核,8g内存,所有的测试场景,cpu,内存,磁盘io都没有到峰值,这说明是某些其他的因素成为了短板。

先说一下结论,mysql插入性能的确可以达到10w/s,load data infile能达到5w/s以上,innodb批量的事务提交,能到达5k/s以上,但是普通的insert,只能40/s

测试经过如下:

建表语句

PHP

CREATE TABLE `user` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(100) NOT NULL,

`age` varchar(22) NOT NULL,

`title` varchar(100) NOT NULL,

`title2` varchar(100) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1;

1

2

3

4

5

6

7

8

CREATETABLE`user`(

`id`int(11)unsignedNOTNULLAUTO_INCREMENT,

`name`varchar(100)NOTNULL,

`age`varchar(22)NOTNULL,

`title`varchar(100)NOTNULL,

`title2`varchar(100)NOTNULL,

PRIMARYKEY(`id`)

)ENGINE=InnoDBAUTO_INCREMENT=1001DEFAULTCHARSET=latin1;

1、清空表,测试普通的插入

PHP

error_reporting(1);

$con = mysql_connect("localhost","root","");

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

// some code

echo $s = time();

echo "\n";

mysql_query("set names utf8");

mysql_select_db('test',$con);

for($i=1;$i<=1000;$i++){

$sql = "insert into user(`name`,`age`,`title`,`title2`) values('name{$i}',{$i},'title{$i}','title{$i}')";

mysql_query($sql);

}

echo 'ok'.time();

echo "\n";

echo $t = time();

echo "\n";

echo ($t-$s);

echo "\n";

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

error_reporting(1);

$con=mysql_connect("localhost","root","");

if(!$con)

{

die('Could not connect: '.mysql_error());

}

// some code

echo$s=time();

echo"\n";

mysql_query("set names utf8");

mysql_select_db('test',$con);

for($i=1;$i<=1000;$i++){

$sql="insert into user(`name`,`age`,`title`,`title2`) values('name{$i}',{$i},'title{$i}','title{$i}')";

mysql_query($sql);

}

echo'ok'.time();

echo"\n";

echo$t=time();

echo"\n";

echo($t-$s);

echo"\n";

结果:

Shell

D:\wamp\www\local.test.com>php index.php

1474362678

ok1474362709

1474362709

31

1

2

3

4

5

D:\wamp\www\local.test.com>phpindex.php

1474362678

ok1474362709

1474362709

31

1000条,31秒,平均32/s

这个结果是不是很意外,当然了,这不是mysql的问题,你如果起多个进程,时间还是这样,但是说明插入的更多,说明应该是mysql_query等的交互中有其他的网络或者io开销,拉低了性能

2、开启事务

还是清空表

PHP

error_reporting(1);

$con = mysql_connect("localhost","root","");

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

// some code

echo $s = time();

echo "\n";

mysql_query("set names utf8");

mysql_select_db('test',$con);

mysql_query("BEGIN");

for($i=1;$i<=100000;$i++){

$sql = "insert into user(`name`,`age`,`title`,`title2`) values('name{$i}',{$i},'title{$i}','title{$i}')";

mysql_query($sql);

}

echo 'ok'.time();

echo "\n";

mysql_query("COMMIT");

echo $t = time();

echo "\n";

echo ($t-$s);

echo "\n";

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

error_reporting(1);

$con=mysql_connect("localhost","root","");

if(!$con)

{

die('Could not connect: '.mysql_error());

}

// some code

echo$s=time();

echo"\n";

mysql_query("set names utf8");

mysql_select_db('test',$con);

mysql_query("BEGIN");

for($i=1;$i<=100000;$i++){

$sql="insert into user(`name`,`age`,`title`,`title2`) values('name{$i}',{$i},'title{$i}','title{$i}')";

mysql_query($sql);

}

echo'ok'.time();

echo"\n";

mysql_query("COMMIT");

echo$t=time();

echo"\n";

echo($t-$s);

echo"\n";

结果:

Shell

D:\wamp\www\local.test.com>php index.php

1474366327

ok1474366342

1474366342

15

D:\wamp\www\local.test.com>

1

2

3

4

5

6

7

D:\wamp\www\local.test.com>phpindex.php

1474366327

ok1474366342

1474366342

15

D:\wamp\www\local.test.com>

插入10w,用了15秒,速度大概为:6666/s 提升很大吧

当然,我还是使用的比较老的mysql函数,应该使用mysqli更好,myisam应该和这个结果差不多。毕竟他没有事务。

3、load data in file

Shell

mysql> load data infile "/wamp/www/local.test.com/1.txt" into table user fields terminated by ',' (name,age,title,title2);

Query OK, 5000000 rows affected (1 min 25.03 sec)

Records: 5000000 Deleted: 0 Skipped: 0 Warnings: 0

1

2

3

mysql>loaddatainfile"/wamp/www/local.test.com/1.txt"intotableuserfieldsterminatedby','(name,age,title,title2);

QueryOK,5000000rowsaffected(1min25.03sec)

Records:5000000Deleted:0Skipped:0Warnings:0

结果很惊人,500w,用了85秒,速度接近5.8w/s,当然这是没有索引的情况,

执行添加一个索引

Shell

[SQL]ALTER TABLE `user`

ADD INDEX `name` (`name`) USING BTREE ;

受影响的行: 0

时间: 38.420s

1

2

3

4

[SQL]ALTERTABLE`user`

ADDINDEX`name`(`name`)USINGBTREE;

受影响的行:0

时间:38.420s

38秒,

4、清空,先建索引,再插入

Shell

mysql> load data infile "/wamp/www/local.test.com/1.txt" into table user fields terminated by ',' (name,age,title,title2);

Query OK, 5000000 rows affected (6 min 8.13 sec)

Records: 5000000 Deleted: 0 Skipped: 0 Warnings: 0

1

2

3

mysql>loaddatainfile"/wamp/www/local.test.com/1.txt"intotableuserfieldsterminatedby','(name,age,title,title2);

QueryOK,5000000rowsaffected(6min8.13sec)

Records:5000000Deleted:0Skipped:0Warnings:0

结果慢了很多,速度大概1.3w/s

所以,结论就是上面说的,mysql自身的插入性能应该没有什么大问题,很多时候都是其他的一些因素影响的。当然机器性能好,肯定结果有提高的。

程序本天成,妙手偶得之!我们只是代码的搬运工!

php mysql 性能_php插入mysql方式性能分析相关推荐

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

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

  2. 阿里云mysql写入性能_插入mysql类型

    MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比如下 ...

  3. php 复制mysql数据库_PHP连接MySQL数据库的三种方式

    本篇文章给大家介绍一下PHP连接MySQL数据库的三种方式(mysql.mysqli.pdo),结合实例形式分析了PHP基于mysql.mysqli.pdo三种方式连接MySQL数据库的相关操作技巧与 ...

  4. php mysql 中文_PHP连接MySQL查询结果中文显示乱码解决方法

    我们首先假设数据库中采用的编码为UTF-8 这时我们在PHP页面中应当首先添加 此处charset的值utf-8必须与文件保存时的编码类型一样 之后在数据库查询前添加 mysql_query(&quo ...

  5. php连接mysql地址_PHP连接mysql

    PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Data Objects) 在 ...

  6. 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例

    本文实例讲述了PHP使用mysql与mysqli连接Mysql数据库的方法.分享给大家供大家参考,具体如下: 代码很简单直接上了 /** * @Author: HTL * @Description: ...

  7. php.ini mysql扩展_PHP安装mysql.so扩展及相关PHP.ini 配置参数说明

    在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...

  8. python监控mysql数据改变_python3小脚本-监控服务器性能并插入mysql数据库

    操作系统: centos版本 7.4 防火墙 关闭 selinux 关闭 python版本 3.6 mysql版本 5.7 #操作系统性能脚本 [root@localhost sql]# cat cp ...

  9. Mysql count 的多种使用方式性能比较

    Mysql的count函数用于统计符合条件的记录数,常用的方式有: 1.count(*) 2.count(1) 3.count(id) 4.count(col) 首先需要明确一点:count函数对于返 ...

最新文章

  1. Generic Data Access Layer泛型的数据访问层
  2. Selenium Webdriver原理终于搞清楚了
  3. bzoj 4488: [Jsoi2015]最大公约数
  4. CentOS7中使用编译github源码方式离线安装Node-RED
  5. 用Scikit-learn和TensorFlow进行机器学习(一)
  6. c++STL的反向迭代器
  7. 关于xfce中桌面没法显示回收站以及thunar中无法进行卷管理的解决办法
  8. PHP代码审计弱类型,[代码审计]php弱类型总结
  9. Sublime Text 全程指南
  10. 使用Configuration Manager部署及管理软件更新(1)
  11. FR决策表单JS实现自动滚屏/滚动效果
  12. Mysql连接的原理
  13. 【Netty源码系列(一)】SpringBoot整合Netty实现多端口绑定
  14. P2916 [USACO08NOV]安慰奶牛Cheering up the Cow
  15. 去掉Chrome自动填充表单浅黄色背景色
  16. 女博士被骗85万 长年泡实验室不知道“徐玉玉”案
  17. ubuntu: 查看cuda版本
  18. 线性插值(双线性)(三线性)
  19. linux查看磁盘是否SSD盘
  20. label 标签属性的总结归纳

热门文章

  1. 微软官方推安全管家,或许不是一场作秀
  2. 打开或关闭 Windows 功能
  3. windows10 系统应用商店怎么重新安装
  4. fatal error C1088
  5. 阿昆同学的Java学习日记Day1
  6. Python 北京二手房成交数据分析过程
  7. python告诉你ti8 dota2英雄bp
  8. matlab 画黄金螺旋,分享:黄金比例螺旋展开线绘制
  9. IDM(Internet Download Manager)—下载各类安装包(github代码、python包)、软件、视频、文档的神器,居家必备良药...
  10. JavaScript冒泡排序(升序排列)