转载自:http://dinglin.iteye.com/blog/1432443

背景

报表统计类的查询是一类耗时的查询。使用场景是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操作。

mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路相关推荐

  1. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  2. 提升PHP性能的21种方法

    提升PHP性能的21种方法. 1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 2.如果能将类的方法定义成static,就尽量定义成s ...

  3. mysql sql测试_MySQL语句测试——数据查询

    MySQL语句测试--数据查询 3.4 数据查询 一.单表查询 /*1.选择表中的若干列,各个列的先后顺序和语句中列名从左到右的顺序一致 select 目标表达式 from 表名; */ /*(1)s ...

  4. mysql 新建子查询_Mysql创建SQL子查询ALIAS

    通常这些被称为视图.例如: CREATE VIEW vMyLongQuery AS SELECT a, b, c FROM (LONG QUERY) X WHERE ... 然后可以像这样引用: SE ...

  5. mysql insert慢_MySQL insert语句慢查询的优化

    近期发现MySQL slow log 里面有很多慢查询,而分析慢查询日志发现大量的慢查询是insert语句的.在高峰期(早上10点左右)半小时的慢查询量可以到28G左右.遂决定优化 优化方法: 1. ...

  6. mysql 连接 分组_MySQL 基础 (四) 分组查询及连接查询

    MySQL 基础 (四) 分组查询及连接查询 MySQL 基础(四) 进阶 5 分组查询 语法: SELECT 分组函数, 列(要求出现在 group by 的后面) FROM 表 [where 筛选 ...

  7. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题

    文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...

  8. mysql结果作为另一次查询_MySql中一次查询结果用作二次查询条件

    Sql的截取关联查询 最近在写sql时,碰到了如下情况, 需求是通过一个账户的id去查询关联的该账户下的所有简历,其中地址字段要通过另一个表进行关联查询.地址字段存的是地址表中对应的编号. 例如210 ...

  9. mysql 多表中间表查询_mysql多表连接查询

    新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...

最新文章

  1. mac 使用nvm安装node
  2. 急需降低系统复杂性,我们从 Kafka 迁移到了 Pulsar
  3. C#窗体控件-组合框控件ComboBox
  4. android的快速开发框架,FastAndroid
  5. Unity FixedUpdate 与 Update 的线程关系实验
  6. 模式识别Pattern Recognition和机器学习Machine Learning资源
  7. sql语句常见问题集锦
  8. 【CyberSecurityLearning 10】扫描与爆破
  9. 安装deepin后桌面以及窗口特效美化:破碎效果
  10. 减一天_一个动作减全身,一天比一天瘦,比跑3000米效果还好
  11. HashMap中put方法的过程
  12. Davinci及U-boot的一些介绍
  13. LeetCode 2008. 出租车的最大盈利(DP)
  14. php curl发送delte,php Curl如何发起POST DELETE GET POST请求
  15. 在固态硬盘上安装win7后没有声音
  16. excel求回归直线方程的公式_“如何在excel中求解任意直线的方程“excel绘制线性回归方程...
  17. C语言实现二路归并排序
  18. easyui Datagrid的deleteRow多行移除问题
  19. 在微信小程序中实现时间日期的选择,并且显示当前选择的时间日期
  20. 沃尔玛erp系统功能分析

热门文章

  1. 服务器主机装普通系统后性能下降,服务器主机性能分析
  2. linux怎么64位,在linux下如何查看CPU是否支持64位
  3. java 多线程池_Java项目中,线程池中线程数量太大会有什么影响?
  4. python 导出大量数据到excel_怎么在python中将大量数据导出到Excel文件
  5. linux安装spec编译器,RPM包制作之Spec文件参数详解
  6. android 获取元素的下标_Appium中定位方式by_android_uiautomator
  7. matlab 电路频率响应_学习电子电路有什么仿真软件?有哪些优缺点?
  8. 单调队列优化和决策单调性优化
  9. VS2010-MFC(文档、视图和框架:分割窗口)
  10. day5-xml模块