MySQL 利用多线程提升查询性能的一种思路

背景

报表统计类的查询是一类耗时的查询。使用场景是QPS并不大,单每个查询由于需要访问较多数据,对大量数据做处理,执行时间较长(通常秒级以上)。

分析

可以将一个大查询分成多个子查询,如果子查询需要访问的数据为整个查询的1/n,则可估计执行时间为1/n。但由于MySQL一个查询只能在单线程中执行,导致即使将一个大查询拆分成多个子查询,多个子查询执行后合并,需要时间为n*1/n=1,仍不能提升其性能。

问题的症结在于只能单线程执行。本方案提供一种引擎Multi-thread-query,让MySQL能够用多线程同时执行多个子查询。由于还要做一点合并工作,整个查询的时间将略大于n个子查询中查询时间最长的一个,即性能接近n倍。

最后一部分举了一个例子,n=3。

方案说明

1、图示

2、用户对MTQ发起查询,MTQ拆分成多个子查询向实体表发起多线程查询。

3、MTQ等待全部线程执行完成后,可以在此基础上执行其他函数操作,如count、avg、group by等。

4、需要修改SQL查询格式,子查询如何拆分,由用户在查询里面指定。

5、适用于每个子查询都是计算量大,返回结果少的情况。(若返回结果越多,合并耗时越大)


举例

以一个统计查询需求为例(数据是构造的,木有神马泄密问题)

一个正常的查询如下:

查询结果

相同机器上使用MTQ查询语法:

MTQ查询结果

可以看到,时间从3s减少为1.2s,查询结果相同,查询语句上可以直接做sum、group by操作。

时间: 2024-11-02 18:15:52

MySQL 利用多线程提升查询性能的一种思路的相关文章

如何合理利用工具提升查询收录效率

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 seoer在日常工作中最常见的一幕就是查询某个页面是否被搜索引擎所收录,页面被收录无论是从宣传角度或是提升整站权重或是通过锚链接对关键字提升排名来说都是异常重要的.对于seo工作者来说,每天几十篇的发布量是很常见的.显而易见的是,发布的信息只有被搜索引擎所收录才会产生效果,如果每个网址都复制粘贴到搜索引擎中搜索一遍是对时间的浪费,在此提供款工

应对Memcached缓存失效,导致高并发查询DB的几种思路

最近看到nginx的合并回源,这个和下面的思路有点像.不过nginx的思路还是在控制缓存失效时的并发请求,而不是当缓存快要失效时,及时地更新缓存. nginx合并回源,参考:http://blog.csdn.net/brainkick/article/details/8570698 update: 2015-04-23 ====================== 当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地

应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询. 解决这个问题有四种思路: 比如一个key是aaa,失效时间是30s.   1.定期从DB里查询数据,再刷到memcached里 这种方法有个缺点是,有些业务的key可能是变化的,不确定的. 而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据.   2.当缓存取到为null时,加锁去查询DB

技术干货:使用静态缓存提升网站性能的五种方法!

本文作者: 乔锐杰 现担任上海驻云信息科技有限公司运维总监/架构师.曾任职过黑客讲师.java软件工程师/网站架构师.高级运维.阿里云架构师等职位.维护过上千台服务器,主导过众安保险.新华社等千万级上云架构.在云端运维.分布式集群架构等方面有着丰富的经验. 以下正文 上次写了一篇数据库缓存,由于快餐式的风格,遭到了广大读友的吐槽.上篇风格有点 " 虚 ",我本身是一个技术控,偏向经验/干货的分享,本文主要描述静态缓存方面的一些心得及分享.作为系列二,有所不足之处,依旧希望大家踊跃&qu

提升PHP性能的21种方法介绍

1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 2.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 3.$row['id'] 的速度是$row[id]的7倍. 4.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2. 5.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreac

提升PHP性能的21种方法介绍_php技巧

1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会.2.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.3.$row['id'] 的速度是$row[id]的7倍.4.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2.5.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.

MySQL优化案例:半连接(semi join)优化方式导致的查询性能低下

以下是来自DBA+社群MySQL领域原创专家李海翔分享的MySQL优化案例,关于MySQL V5.6.x/5.7.x SQL查询性能问题.   专家简介   李海翔 网名:那海蓝蓝 DBA+社群MySQL领域原创专家 从事数据库研发.数据库测试与技术管理等工作10余年,对数据库的内核有深入研究,擅长于PostgreSQL和MySQL等开源数据库的内核与架构.现任职于Oracle公司MySQL全球开发团队,从事查询优化技术的研究和MySQL查询优化器的开发工作.著有<数据库查询优化器的艺术>一书

怎么利用多线程LRU刷新突破MySQL瓶颈?

In this blog post, we'll discuss how to use multi-threaded LRU flushing to prevent bottlenecks in MySQL. 在这篇文章中,我们会讨论怎么利用多线程LRU刷新突破MySQL的瓶颈. In the previous post, we saw that InnoDB 5.7 performs a lot of single-page LRU flushes, which in turn are ser

MySQL架构优化实战系列2:主从复制同步与查询性能调优

一.主从复制同步部署   1.概念 主从复制:2台以上mysql服务器, 做负载均衡, 主服务器负责增删改 , 从服务器负责查询 同步原理:mysql开启bin-log日志,主服务器所有的增删改操作会记录到bin-log日志:然后主服务器把bin-log日志发送 给 从服务器 , 从服务器重放bin-log日志 确保数据同步 2.开启bin-log日志 配置 my.cnf 文件 并重启 mysql [root@localhost etc]# vim /etc/my.cnf     [root@l