问题

通常一个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数据库异步查询实现相关推荐

  1. 如何用linux登入数据库,Linux中MySQL数据库的使用①-----登录、数据库操作、表结构操作...

    启动mysql服务 systemctl start mysqld 登录mysql mysql -u root -p # 登录本机 mysql -u root -hlocalhost -P3306 -p ...

  2. 从linux中恢复数据库,linux中mysql数据库的备份与恢复

    mysqldump常见选项: --all-databases, -A: 备份所有数据库 --databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump把第一个名字参数作为数据 ...

  3. Django中Mysql数据库的使用

    django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作. 使用django进行数据库开发的步骤如下: 配置数据库连接信息 在配置文件中注册 ...

  4. phpcms mysql 事务_PHPCMS中mysql数据库优化教程

    PHPCMS中mysql数据库优化教程 在全体的系统运转过程中,数据库服务器 MySQL 的压力是最大的,不只占用很多的内存和 cpu 资源,而且占用着大局部的磁盘 io 资源,连 PHP 的民间都在 ...

  5. 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率

    在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面: a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 w ...

  6. jenkins查询mysql_jenkins流水线使用mysql数据库

    在某些情况下, 我们可能需要通过jenkins连接数据库做一些数据的持久化操作 环境准备 mysql数据库 以往安装mysql数据库都是在网上先找的安装教程,捣鼓半天才能安装上.后来发现通过docke ...

  7. linux下数据库mysql命令大全_linux中mysql数据库操作命令大全有哪些

    Linux中经常会对数据库进行操作,除了在软件应用中操作,还能使用命令实现,具体有哪些命令呢?下面由学习啦小编为大家整理了linux重启mysql数据库命令的相关知识,希望对大家有帮助! linux中 ...

  8. java怎么查询千万数据,从java方面,在一个千万级的数据库查寻中,如何提高查询效率?...

    从java方面,在一个千万级的数据库查寻中,如何提高查询效率? 更多相关问题 请分析下面的歌曲<沂蒙山我的娘亲亲>片段中采用了那种长音或休止处的处理方法faea48d2d30c3b221e ...

  9. java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构 ...

最新文章

  1. HTTPS安全证书介绍
  2. BIM机器人来袭、你害怕了吗
  3. 丹佛大学计算机科学专业,丹佛大学
  4. Redis的超时命令和垃圾回收策略
  5. 「2012-12-29」3x3手机锁屏矩阵图像的组合数量
  6. 你必须知道iPad的10件事
  7. 16.6 假新闻识别 Fake News Detection on Social Media A Data Mining Perspective
  8. ChinaDDoS BGP 流量牵引二层VLAN回注配置
  9. VSCODE + 搜狗输入法,文字突然变成了繁体字,为什么?
  10. 用keytool生成证书
  11. V831烧录 【app文件的烧写】
  12. 实验记录 | somatic.pl运行1
  13. HDU2571 命运(DP)
  14. python判断特殊字符的函数,python学习--quote()函数,,屏蔽特殊的字符、比如
  15. One PUNCH Man——线性回归算法
  16. win10系统文件拖拽卡顿_win10电脑中鼠标拖动窗口有延迟如何解决
  17. kdevelop快捷键
  18. 编写PE文件解析器(三)
  19. 学物联网必须要知道的云平台ThingsBoard
  20. 《中国企业家》杂志:卫哲第二道伤疤

热门文章

  1. 飞畅科技-交换机的三种交换方式详解
  2. 工业交换机的几大“择机”标准,你学会了吗?
  3. 【渝粤题库】广东开放大学 跨境电商搜索引擎优化 形成性考核
  4. 【渝粤题库】国家开放大学2021春2617生产与运作管理题目
  5. 信息技术与计算机文化的问题,信息技术与计算机文化
  6. MATLAB库函数unwrap(相位解卷绕)的C语言实现
  7. 让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性
  8. 不同阶QAM调制星座图中,符号能量的归一化计算原理
  9. 【题解】Luogu P2347 砝码称重
  10. C++ 贪吃蛇小游戏