php mysql 性能_php插入mysql方式性能分析
一直以来各种人都在争论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方式性能分析相关推荐
- mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...
这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...
- 阿里云mysql写入性能_插入mysql类型
MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比如下 ...
- php 复制mysql数据库_PHP连接MySQL数据库的三种方式
本篇文章给大家介绍一下PHP连接MySQL数据库的三种方式(mysql.mysqli.pdo),结合实例形式分析了PHP基于mysql.mysqli.pdo三种方式连接MySQL数据库的相关操作技巧与 ...
- php mysql 中文_PHP连接MySQL查询结果中文显示乱码解决方法
我们首先假设数据库中采用的编码为UTF-8 这时我们在PHP页面中应当首先添加 此处charset的值utf-8必须与文件保存时的编码类型一样 之后在数据库查询前添加 mysql_query(&quo ...
- php连接mysql地址_PHP连接mysql
PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Data Objects) 在 ...
- 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例
本文实例讲述了PHP使用mysql与mysqli连接Mysql数据库的方法.分享给大家供大家参考,具体如下: 代码很简单直接上了 /** * @Author: HTL * @Description: ...
- php.ini mysql扩展_PHP安装mysql.so扩展及相关PHP.ini 配置参数说明
在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...
- python监控mysql数据改变_python3小脚本-监控服务器性能并插入mysql数据库
操作系统: centos版本 7.4 防火墙 关闭 selinux 关闭 python版本 3.6 mysql版本 5.7 #操作系统性能脚本 [root@localhost sql]# cat cp ...
- Mysql count 的多种使用方式性能比较
Mysql的count函数用于统计符合条件的记录数,常用的方式有: 1.count(*) 2.count(1) 3.count(id) 4.count(col) 首先需要明确一点:count函数对于返 ...
最新文章
- Generic Data Access Layer泛型的数据访问层
- Selenium Webdriver原理终于搞清楚了
- bzoj 4488: [Jsoi2015]最大公约数
- CentOS7中使用编译github源码方式离线安装Node-RED
- 用Scikit-learn和TensorFlow进行机器学习(一)
- c++STL的反向迭代器
- 关于xfce中桌面没法显示回收站以及thunar中无法进行卷管理的解决办法
- PHP代码审计弱类型,[代码审计]php弱类型总结
- Sublime Text 全程指南
- 使用Configuration Manager部署及管理软件更新(1)
- FR决策表单JS实现自动滚屏/滚动效果
- Mysql连接的原理
- 【Netty源码系列(一)】SpringBoot整合Netty实现多端口绑定
- P2916 [USACO08NOV]安慰奶牛Cheering up the Cow
- 去掉Chrome自动填充表单浅黄色背景色
- 女博士被骗85万 长年泡实验室不知道“徐玉玉”案
- ubuntu: 查看cuda版本
- 线性插值(双线性)(三线性)
- linux查看磁盘是否SSD盘
- label 标签属性的总结归纳
热门文章
- 微软官方推安全管家,或许不是一场作秀
- 打开或关闭 Windows 功能
- windows10 系统应用商店怎么重新安装
- fatal error C1088
- 阿昆同学的Java学习日记Day1
- Python 北京二手房成交数据分析过程
- python告诉你ti8 dota2英雄bp
- matlab 画黄金螺旋,分享:黄金比例螺旋展开线绘制
- IDM(Internet Download Manager)—下载各类安装包(github代码、python包)、软件、视频、文档的神器,居家必备良药...
- JavaScript冒泡排序(升序排列)