转自:https://www.jianshu.com/p/4b4efe5cdc38

在PHP-FPM处理HTTP请求时,有时会遇到一个请求需要进行多次MySQL查询(在报表类应用中比较常见)。通常我们会以串行方式查询:

$link = new mysqli();$rs1 = $link->query('SELECT * FROM table1');
while ($row = $rs1->fetch_row()) { ... }$rs2 = $link->query('SELECT * FROM table2'); while ($row = $rs2->fetch_row()) { ... } $rs3 = $link->query('SELECT * FROM table3'); while ($row = $rs3->fetch_row()) { ... } 

串行查询方式有个缺点:在MySQL返回数据之前,PHP一直是处于空等的状态,不会继续往后执行。如果数据量大或者查询复杂,MySQL响应可能会比较慢,那么以串行方式查询会有一些延迟。给用户最直接的感受就是 Loading... 的圈圈一直打转。

那么有什么办法可以减少查询MySQL的时间?用多进程并行查询不行,因为PHP-FPM 中不允许用 pcntl_fork 一类的调用。

幸好还有 mysqlnd,mysqlnd提供了类似 stream_select 的机制(见 这篇文章) ,可以做到在单进程中对MySQL并行查询。这主要运用了mysqli_pollreap_async_query 两个函数。

还是通过例子来介绍MySQL并行查询的实施方法。假设要并行地向MySQL发出10个查询,最基本的代码应该是这样的:

1.  $links = [];
2.  for ($i = 0; $i !== 10; $i++) { 3. $links[$i] = new mysqli('127.0.0.1', 'user', 'password', 'db1'); 4. $links[$i]->query('SELECT SLEEP(1)', MYSQLI_ASYNC); 5. } 6. $allResult = []; 7. while (!empty($links)) { 8. $reads = $links; 9. $errors = $reject = []; 10. if (!mysqli_poll($reads, $errors, $reject, null)) { 11. continue; 12. } 13. foreach ($reads as $read) { 14. $idx = array_search($read, $links, true); 15. $allResult[$idx] = []; 16. $result = $read->reap_async_query(); 17. while ($row = $result->fetch_row()) { 18. $allResult[$idx][] = $row; 19. } 20. $read->close(); 21. unset($links[$idx]); 22. } 23. } 

解释下这段代码的含义:

  1. 2~5行,同时发起10个MySQL连接,并发出查询
    注意query() 的第二个参数带上了 MYSQLI_ASYNC 表示非阻塞查询

  2. 10行,使用mysqli_poll 轮询10个连接的查询有无返回
    mysqli_poll 的第一个参数$reads是个数组,包含需要轮询那些连接。mysqli_poll 执行完后,会改写$reads,改写后$reads包含的是那些已经有数据返回连接。

    mysqli_poll的第四个参数,控制的是轮询的等待时间,单位是“秒”。如果像本例当中设置为null,那么mysqli_poll轮询是阻塞的:只有监听的连接中,任意一个连接有数据返回了,mysqli_poll才会返回。如果等待时间设置为0,那么每次执行mysqli_poll会立即返回,外层的while会频繁循环。

  3. 第11~19行,遍历已经有数据返回的连接
    reap_async_query和普通query一样,返回的是mysqli_result,可以一行行fetch数据

  4. 20~21行,对于已经获得了数据的连接,下次mysqli_poll就不需要再轮询这个连接了,所以关闭连接,并从$links数组删除这个连接
    当所有的连接都返回了数据,$links数组空了,while循环也就终止了。

使用并行查询的方式,可以大大缩短处理HTTP请求的时间,假设本例中的10个SQL查询,每个需要执行1秒。因为是并行,处理所有的查询,也只需要1秒左右。

转载于:https://www.cnblogs.com/xiaqiuchu/articles/11061558.html

PHP并行查询MySQL相关推荐

  1. 华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?

    摘要:GaussDB(for MySQL)并行查询为何快人一步?华为云数据库内核专家这样说 本文分享自华为云社区<华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快 ...

  2. mysql 并行查询_MySQL 8.0新特性-并行查询innodb_parallel_read_threads

    原文很好翻译,直接读好理解 长久以来MySQL没有并行查询,并且在其他数据库已经有了的情况下,MySQL终于在8.0.14版本开始有了自己的并行查询,但使用面非常的窄,只适用于并行聚集索引的count ...

  3. PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合

    前言 大家都知道,PostgreSQL 近几大版本中加入了很多 OLAP 相关特性.9.6 的并行扫描应该算最大的相关特性.在今年发布的 10.0 中,并行扫描也在不断加强,新增了并行的索引扫描. 我 ...

  4. oracle 实时负载查询,Oracle并行查询

    所谓并行执行,是指能够将一个大型串行任务(任何DML,一般的DDL)物理的划分为叫多个小的部分,这些较小的部分可以同时得到处理 Oracle 并行执行 所谓并行执行,是指能够将一个大型串行任务(任何D ...

  5. Amazon Aurora 并行查询——加速分析处理的利器

    Amazon Aurora 既具有高端商用数据库的性能和可用性,又具有开源数据库的简单性和成本效益.它提供了比标准 MySQL 高五倍的吞吐量,并且具有更高的可扩展性.持久性和安全性. Amazon ...

  6. MySQL8.0 InnoDB并行查询特性

    作者:雁闲,阿里云 PolarDB M内核研发专家,主要从事PolarDB存储引擎开发. 概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透.之所以流行 ...

  7. mysql show processlist info null_关于查询mysql processlist的建议

    查询mysql进程,因为数据库的sleep连接很多(一般都会在几千个左右),不建议直接show processlist或者show full Processlist 尽量去用select查询 正在ru ...

  8. python查询mysql中文乱码问题

    相信很多在工作中的Python小伙伴,经常会遇到一些工作上的问题,例如查询mysql中文乱码问题,Python连接mysql数据库时,读取数据库中的中文出现乱码,所有中文都显示为问号了,那么该如何解决 ...

  9. PostgreSQL SQL 语言:并行查询

    本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 并行查询如何工作 当优化器判断对于某一个特定的查询,并行查询是最快的执行策略时,优化器将创建一个查询计划.该计划包括 ...

最新文章

  1. 《CLR Via C# 第3版》笔记之(二) - 响应文件
  2. bzoj4006: [JLOI2015]管道连接
  3. 阿里云有一群 “猪猪侠”
  4. 派生类构造的时候一定要调用_夏天使用电蚊香的时候一定要注意这几点
  5. pickle 在python 2和python 3中兼容性问题
  6. Webrtc之2台电脑视频聊天
  7. 智能家居APP原型设计(附下载链接)—基于物联网的终端设备设计研究—Axure9高保真原型设计
  8. html 分割字符串,详解js常用分割取字符串的方法
  9. 凯撒密码(移位密码)
  10. AHP(层次分析法)学习笔记及多层权重Python实践
  11. 雷军到底有多少钱!!
  12. 银河英雄传说旗舰名称考证—帝国军
  13. C++学习(七十二)英寸 厘米 像素 dpi 分辨率
  14. kafka zookeeper docker容器互联
  15. 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])
  16. 微信小程序实现雪花飘落的效果
  17. 2022年山东省安全员C证考试及山东省安全员C证考试题库
  18. docker容器的两类存储
  19. 【情态动词练习题】can 和 could
  20. make: *** 没有规则可制作目标“check_python_dependencies”......问题解决方法

热门文章

  1. dz手机版空白显示index.php,关于Discuz x3.3页面空白解决方法
  2. aop 获取方法入参出参_Spring AOP 如何将参数传递给需要织入的方法
  3. 深度学习之卷积神经网络CNN
  4. Pyqt 打开外部链接的几种方法
  5. 浅谈Hibernate中的几个查询
  6. ubuntu 下的截图工具
  7. HP 3PAR公用存储的妙用
  8. 微软强行安装Firefox扩展程序
  9. Photoshop修复和合成梦幻人物
  10. 技嘉z77主板msata速度_功不可没的技嘉Z77主板_主板评测-中关村在线