首页 存档 技术 查看内容

向Facebook学习,通过协程实现Mysql查询的异步化

2018-3-30 13:00 |来自: 互联网 349 0

摘要: (点击上方公众号,可快速关注) 来源:信海龙 网址:http://www.bo56.com/ 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能。由于facebook实现的比较早,他们不得不对php进 ...

(点击上方公众号,可快速关注)


来源:信海龙

网址:http://www.bo56.com/

前言

最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能。由于facebook实现的比较早,他们不得不对php进行hack才得以实现。现在的php5.5,已经无需hack就可以实现了。

对于一个web网站的性能来说,瓶颈多半是来自于数据库。一般数据库查询会在某个请求的整体耗时中占很大比例。如果能提高数据库查询的效率,网站的整体响应时间会有很大的下降。如果能实现mysql查询的异步化,就可以实现多条sql语句同时执行。这样就可以大大缩短mysql查询的耗时。

异步为啥比同步快?

与异步查询相反的时同步查询。通常情况下mysql的query查询都是同步方式。下面我们对两种方式做下对比。对比的例子是,请求两次select sleep(1)。这条语句在mysql服务器端大概耗时1000ms。

同步方式的执行流程:


第一步,向mysql服务器端发送第一次查询请求。大概耗时 1ms

第二步,mysql服务器端返回第一次查询的结果。大概耗时 1000ms

第三步,向mysql服务器再次发送请求。大概耗时 1ms

第四步,mysql服务器端返回第二次查询的结果。大概耗时 1000ms

同步的方式执行两次select sleep(1),大概耗时 2002ms。

异步方式的执行流程:


  • 第一步,向mysql服务器端发送第一次查询请求。大概耗时1ms

  • 第二步,在等待第一次请求返回数据的同时,向服务器端发送第二次查询请求。大概耗时 1ms

  • 第三步,接受mysql服务器端返回的两次查询请求。大概耗时 1000ms。

对比分析

异步查询比同步查询速度快,是因为多条查询语句在服务器端同时执行,大大缩短了服务器端的响应时间。并行一般情况下总比串行快嘛。sql语句执行时间越长,效果越明显。

如何实现mysql的异步查询?

要实现异步查询的关键是能把发送请求和接受返回数据分开。正好mysqlnd中提供了这个特性。

在mysqlnd中对应的方法是:

  • mysqlnd_async_query 发送查询请求

  • mysqlnd_reap_async_query 获取查询结果

mysqli扩展针对mysqlnd的这个特性做了封装,在调用query方法时,传入MYSQLI_ASYNC即可。

具体代码实现可以查看博文 php中mysql数据库异步查询实现

为啥使用协程?

查看了博文中的代码实现,是不是感觉写法和平时不一样?一般在项目当中,我们都是以function的形式去相互调用,function中包含了数据库查询。为了保持这个习惯,方便大家使用,因此引入了协程。在php5.5中正好提供了yield和generator,方便我们实现协程。示例代码如下:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部