mysql怎么加并行查询 mysql支持并行查询么-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

mysql怎么加并行查询 mysql支持并行查询么

spark怎样并发的从mysql查询数据

在已有的 MySQL 服务器之上使用 Apache Spark (无需将数据导出到 Spark 或者 Hadoop 平台上),这样至少可以提升 10 倍的查询性能。使用多个 MySQL 服务器(复制或者 Percona XtraDB Cluster)可以让我们在某些查询上得到额外的性能提升。你也可以使用 Spark 的缓存功能来缓存整个 MySQL 查询结果表。

10年积累的成都网站制作、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有海丰免费网站建设让你可以放心的选择与我们合作。

思路很简单:Spark 可以通过 JDBC 读取 MySQL 上的数据,也可以执行 SQL 查询,因此我们可以直接连接到 MySQL 并执行查询。那么为什么速度会快呢?对一些需要运行很长时间的查询(如报表或者BI),由于 Spark 是一个大规模并行系统,因此查询会非常的快。MySQL 只能为每一个查询分配一个 CPU 核来处理,而 Spark 可以使用所有集群节点的所有核。在下面的例子中,我们会在 Spark 中执行 MySQL 查询,这个查询速度比直接在 MySQL 上执行速度要快 5 到 10 倍。

另外,Spark 可以增加“集群”级别的并行机制,在使用 MySQL 复制或者 Percona XtraDB Cluster 的情况下,Spark 可以把查询变成一组更小的查询(有点像使用了分区表时可以在每个分区都执行一个查询),然后在多个 Percona XtraDB Cluster 节点的多个从服务器上并行的执行这些小查询。最后它会使用map/reduce 方式将每个节点返回的结果聚合在一起形成完整的结果。

mysql+多线程并行查询?

其实最简单的方法是用timer控件,timer控件本事就是对一个线程的封装

所以你用两个timer控件就可以模拟两个线程了

或者用两个backgroundworker控件,这个更逼真,不用定时触发

具体用法,我空间里有教程

希望能解决您的问题。

PHP + Mysql多个表并行查询如何实现

在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_poll 和 reap_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. }

解释下这段代码的含义:

2~5行,同时发起10个MySQL连接,并发出查询

注意query() 的第二个参数带上了 MYSQLI_ASYNC 表示非阻塞查询

10行,使用mysqli_poll 轮询10个连接的查询有无返回

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

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

第11~19行,遍历已经有数据返回的连接

reap_async_query和普通query一样,返回的是mysqli_result,可以一行行fetch数据

20~21行,对于已经获得了数据的连接,下次mysqli_poll就不需要再轮询这个连接了,所以关闭连接,并从$links数组删除这个连接

当所有的连接都返回了数据,$links数组空了,while循环也就终止了。

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


当前标题:mysql怎么加并行查询 mysql支持并行查询么
当前链接:http://kswsj.cn/article/docchgd.html

其他资讯