php异步查询数据库,php中mysql数据库异步查询实现
问题
通常一个web应用的性能瓶颈在数据库。因为,通常情况下php中mysql查询是串行的。也就是说,如果指定两条sql语句时,第二条sql语句会等到第一条sql语句执行完毕再去执行。这个时候,如果执行2条sql语句,每条执行时间为50ms,全部执行完毕可能需要100ms。既然,主要原因是sql的串行执行导致。那我们是不是可以改变执行方式来提高性能呢?答案是,可以的。我们可以通过异步执行的方式来提高性能。
异步
如果通过异步的方式去执行,可能性能会有很大提升。如果是采用异步的方式,两条sql语句会并发执行,可能就需要60ms就可以执行完毕。
实现
mysqli + mysqlnd。php官方实现的mysqlnd中提供了异步查询的方法。分别是:
mysqlnd_async_query 发送查询请求
mysqlnd_reap_async_query 获取查询结果
这样就可以不必每次发送完查询请求后,一直阻塞等待查询结果了。
实现代码如下: int,
* 2 => int,
* 3 => int
* )
*/
$result = array(1=>0, 2=>0, 3=>0);
//异步方式[并发请求]
$time_start = microtime(true);
$links = array();
foreach ($result as $key=>$value) {
$obj = new mysqli($host, $user, $password, $database);
$links[spl_object_hash($obj)] = array('value'=>$key, 'link'=>$obj);
}
$done = 0;
$total = count($links);
foreach ($links as $value) {
$value['link']->query("SELECT COUNT(*) AS `total` FROM `demo` WHERE `value`={$value['value']}", MYSQLI_ASYNC);
}
do {
$tmp = array();
foreach ($links as $value) {
$tmp[] = $value['link'];
}
$read = $errors = $reject = $tmp;
$re = mysqli_poll($read, $errors, $reject, 1);
if (false === $re) {
die('mysqli_poll failed');
} elseif ($re < 1) {
continue;
}
foreach ($read as $link) {
$sql_result = $link->reap_async_query();
if (is_object($sql_result)) {
$sql_result_array = $sql_result->fetch_array(MYSQLI_ASSOC);//只有一行
$sql_result->free();
$hash = spl_object_hash($link);
$key_in_result = $links[$hash]['value'];
$result[$key_in_result] = $sql_result_array['total'];
} else {
echo $link->error, "\n";
}
$done++;
}
foreach ($errors as $link) {
echo $link->error, "1\n";
$done++;
}
foreach ($reject as $link) {
printf("server is busy, client was rejected.\n", $link->connect_error, $link->error);
//这个地方别再$done++了。
}
} while ($done
var_dump($result);
echo "ASYNC_QUERY_TIME:", microtime(true)-$time_start, "\n";
$link = end($links);
$link = $link['link'];
echo "\n";
结语
mysql数据库对于每个查询请求都是单独启动一个线程进行处理。如果mysql服务器启动线程过多,必然会造成线程切换引起系统负载过高。如果在mysql数据库负载不高的情况下,使用异步查询还是不错的选择。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php异步查询数据库,php中mysql数据库异步查询实现相关推荐
- 如何用linux登入数据库,Linux中MySQL数据库的使用①-----登录、数据库操作、表结构操作...
启动mysql服务 systemctl start mysqld 登录mysql mysql -u root -p # 登录本机 mysql -u root -hlocalhost -P3306 -p ...
- 从linux中恢复数据库,linux中mysql数据库的备份与恢复
mysqldump常见选项: --all-databases, -A: 备份所有数据库 --databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump把第一个名字参数作为数据 ...
- Django中Mysql数据库的使用
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作. 使用django进行数据库开发的步骤如下: 配置数据库连接信息 在配置文件中注册 ...
- phpcms mysql 事务_PHPCMS中mysql数据库优化教程
PHPCMS中mysql数据库优化教程 在全体的系统运转过程中,数据库服务器 MySQL 的压力是最大的,不只占用很多的内存和 cpu 资源,而且占用着大局部的磁盘 io 资源,连 PHP 的民间都在 ...
- 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面: a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 w ...
- jenkins查询mysql_jenkins流水线使用mysql数据库
在某些情况下, 我们可能需要通过jenkins连接数据库做一些数据的持久化操作 环境准备 mysql数据库 以往安装mysql数据库都是在网上先找的安装教程,捣鼓半天才能安装上.后来发现通过docke ...
- linux下数据库mysql命令大全_linux中mysql数据库操作命令大全有哪些
Linux中经常会对数据库进行操作,除了在软件应用中操作,还能使用命令实现,具体有哪些命令呢?下面由学习啦小编为大家整理了linux重启mysql数据库命令的相关知识,希望对大家有帮助! linux中 ...
- java怎么查询千万数据,从java方面,在一个千万级的数据库查寻中,如何提高查询效率?...
从java方面,在一个千万级的数据库查寻中,如何提高查询效率? 更多相关问题 请分析下面的歌曲<沂蒙山我的娘亲亲>片段中采用了那种长音或休止处的处理方法faea48d2d30c3b221e ...
- java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构 ...
最新文章
- HTTPS安全证书介绍
- BIM机器人来袭、你害怕了吗
- 丹佛大学计算机科学专业,丹佛大学
- Redis的超时命令和垃圾回收策略
- 「2012-12-29」3x3手机锁屏矩阵图像的组合数量
- 你必须知道iPad的10件事
- 16.6 假新闻识别 Fake News Detection on Social Media A Data Mining Perspective
- ChinaDDoS BGP 流量牵引二层VLAN回注配置
- VSCODE + 搜狗输入法,文字突然变成了繁体字,为什么?
- 用keytool生成证书
- V831烧录 【app文件的烧写】
- 实验记录 | somatic.pl运行1
- HDU2571 命运(DP)
- python判断特殊字符的函数,python学习--quote()函数,,屏蔽特殊的字符、比如
- One PUNCH Man——线性回归算法
- win10系统文件拖拽卡顿_win10电脑中鼠标拖动窗口有延迟如何解决
- kdevelop快捷键
- 编写PE文件解析器(三)
- 学物联网必须要知道的云平台ThingsBoard
- 《中国企业家》杂志:卫哲第二道伤疤
热门文章
- 飞畅科技-交换机的三种交换方式详解
- 工业交换机的几大“择机”标准,你学会了吗?
- 【渝粤题库】广东开放大学 跨境电商搜索引擎优化 形成性考核
- 【渝粤题库】国家开放大学2021春2617生产与运作管理题目
- 信息技术与计算机文化的问题,信息技术与计算机文化
- MATLAB库函数unwrap(相位解卷绕)的C语言实现
- 让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性
- 不同阶QAM调制星座图中,符号能量的归一化计算原理
- 【题解】Luogu P2347 砝码称重
- C++ 贪吃蛇小游戏