博客
关于我
MySQL 异步查询提高查询速度
阅读量:432 次
发布时间:2019-03-05

本文共 1814 字,大约阅读时间需要 6 分钟。

本文解决什么问题

什么是 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 );

转载地址:http://enuzz.baihongyu.com/

你可能感兴趣的文章
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>