MySQL 异步查询提高查询速度

本文探讨MySQL异步查询的概念及其实现方式,通过开启多条MySQL线程提高查询速度,尤其是在处理大量数据和多表联合查询场景下,显著提升了查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文解决什么问题

什么是 MySQL 异步查询

MySQL 异步查询的优缺点

一个例子

异步查询功能

MySQLi 扩展提供了异步查询功能,需要使用 mysqlnd ( MySQL Native Driver ) 作为数据库的驱动。

mysqlnd 是 Zend 公司开发的 MySQL 数据库驱动,采用 PHP 开源协议,用于代替旧版的有 MySQL AB 公司(现 oracle) 开发的 libmysql, PHP 5.3 版本之后提供, PHP 5.4 之后的版本 mysqlnd 为默认配置选项。

MySQL 异步查询的优缺点

异步查询会开启多条 MySQL 线程,会带来一定的 cpu占用和内存使用。但是换来的是更高的查询速度。

比如我们 100w 数据在 40 张表中,原先查 40 张表的 union all 视图需要 20 多秒,使用的异步查询基本 1秒不到就出结果了。

一个列子

背景: 查询 40 张分表的数据,性能换时间。

主要使用了 MySQLI 提供的 mysqli_poll、reap_async_query 扩展方法

$table_separate_cnt = 40;
      $sqls               = [];
      for ( $i = 0; $i < $table_separate_cnt; $i ++ ) {
        $sql = 'select * from news' + $i;
        array_push( $sqls, $sql );
      }
      $links = [];

      // 链接数据库,并发起异步查询
      foreach ( $sqls as $sql ) {
        $link = mysqli_connect( $hostname, $username, $password, 'test', '3306' );
        $link->query( $sql, MYSQLI_ASYNC ); // 发起异步查询,立即返回
        $links[ $link->thread_id ] = $link;
      }
      $llen    = count( $links );
      $process = 0;
      $res     = [];
      do {
        $r_array = $e_array = $reject = $links;
        // 多路复用轮询IO
        if ( ! ( $ret = mysqli_poll( $r_array, $e_array, $reject, 2 ) ) ) {
          continue;
        }

        // 读取有结果返回的查询,处理结果
        foreach ( $r_array as $link ) {
          if ( $result = $link->reap_async_query() ) {
            $r = $result->fetch_array();
            if($r)
            {
              $res[] = $r;
            }
            if ( is_object( $result ) ) {
              mysqli_free_result( $result );
            }
          }

          // 操作完后,把当前数据链接从待轮询集合中删除
          unset( $links[ $link->thread_id ] );
          $link->close();
          $process ++;
        }
        foreach ( $e_array as $link ) {
          die;
        }
        foreach ( $reject as $link ) {
          die;
        }
      } while ( $process < $llen );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡德咏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值