背景
报表统计类的查询是一类耗时的查询。使用场景是QPS并不大,单每个查询由于需要访问较多数据,对大量数据做处理,执行时间较长(通常秒级以上)。
分析
可以将一个大查询分成多个子查询,如果子查询需要访问的数据为整个查询的1/n,则可估计执行时间为1/n。但由于MySQL一个查询只能在单线程中执行,导致即使将一个大查询拆分成多个子查询,多个子查询执行后合并,需要时间为n*1/n=1,仍不能提升其性能。
问题的症结在于只能单线程执行。本方案提供一种引擎Multi-thread-query,让MySQL能够用多线程同时执行多个子查询。由于还要做一点合并工作,整个查询的时间将略大于n个子查询中查询时间最长的一个,即性能接近n倍。
最后一部分举了一个例子,n=3。
方案说明
1、图示
![](http://dl.iteye.com/upload/attachment/0063/9637/bd50582a-2849-30c5-876a-d78da15dd1fc.jpg)
2、用户对MTQ发起查询,MTQ拆分成多个子查询向实体表发起多线程查询。
3、MTQ等待全部线程执行完成后,可以在此基础上执行其他函数操作,如count、avg、group by等。
4、需要修改SQL查询格式,子查询如何拆分,由用户在查询里面指定。
5、适用于每个子查询都是计算量大,返回结果少的情况。(若返回结果越多,合并耗时越大)
举例
以一个统计查询需求为例(数据是构造的,木有神马泄密问题)
一个正常的查询如下:
![](http://dl.iteye.com/upload/attachment/0063/9639/2a0c1711-d3fc-322f-aaca-e996b6be44b4.jpg)
查询结果
相同机器上使用MTQ查询语法:
![](http://dl.iteye.com/upload/attachment/0063/9643/a4412602-e5f4-370a-8ce4-757b3e59adce.jpg)
MTQ查询结果
![](http://dl.iteye.com/upload/attachment/0063/9645/23fe05df-4025-3f5e-8994-8f336c04fb1a.jpg)
可以看到,时间从3s减少为1.2s,查询结果相同,查询语句上可以直接做sum、group by操作。
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0063/9637/bd50582a-2849-30c5-876a-d78da15dd1fc-thumb.jpg)
- 大小: 15.5 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0063/9639/2a0c1711-d3fc-322f-aaca-e996b6be44b4-thumb.jpg)
- 大小: 44.6 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0063/9641/8feb364b-17dc-39a8-ad66-85d4164131e7-thumb.jpg)
- 大小: 65.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0063/9643/a4412602-e5f4-370a-8ce4-757b3e59adce-thumb.jpg)
- 大小: 150.4 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0063/9645/23fe05df-4025-3f5e-8994-8f336c04fb1a-thumb.jpg)
- 大小: 63.3 KB
分享到:
相关推荐
该工具的思路是在备库的SQL线程执行更新之前,先预加载相关的数据到内存中,通过多个工作线程并行读取和执行查询。这样,即使备库的SQL线程是I/O-bound,也能利用空闲的I/O能力来提升处理速度。`relayfetch`支持ROW...
- **JAVA技术**:强大的面向对象编程语言,尤其适用于企业级应用开发,提供了丰富的库和工具,支持多线程、网络通信等功能。 6. **需求分析** - **功能需求**:包括病患信息录入与查询、费用明细计算、缴费记录...
首先,让我们深入了解PHP和Swoole的结合如何提升性能。PHP作为一种解释型语言,其执行效率相对较低,尤其是在处理网络请求和长时间运行的任务时。Swoole提供了底层的TCP、UDP、HTTP、WebSocket等网络通信协议的...
在并行编程项目中,可以看到如何利用多线程提高程序性能或实现异步操作。 8. **设计模式** 项目代码可能运用了多种设计模式,如工厂模式、单例模式、观察者模式等。设计模式是解决常见编程问题的通用解决方案,...
2. **协议设计**:QQ客户端和服务端之间需要一种约定,即通信协议,定义如何打包和解包消息,如何识别不同类型的消息,以及如何处理错误。这可能包括定义特定的报文格式,比如JSON或自定义的二进制格式。 3. **多...
在信息技术领域,C/S(Client/Server)架构是一种常见的软件系统设计模式,它将应用程序分为客户端和服务器端两部分,客户端负责用户交互,服务器端则处理数据存储和计算。本篇文章将深入探讨如何利用VC++这一强大的...
Java是一种跨平台的面向对象的编程语言,以其“一次编写,到处运行”的特性而受到广泛欢迎。在聊天系统中,Java提供了丰富的类库和API,如Socket编程接口,用于实现客户端与服务器之间的通信。此外,Java的并发处理...
在财务管理系统中,Java的特性如垃圾回收、多线程和丰富的类库为系统的高效运行和安全提供了保障。 2. **MVC架构**:模型-视图-控制器(Model-View-Controller)是软件设计的一种模式,主要用于分离业务逻辑、用户...
3. 多线程处理:对于耗时的操作,如大量数据的读写,可以考虑使用多线程来提高响应速度。 4. 错误处理与日志:良好的错误处理机制是系统稳定运行的关键,同时记录日志便于后期排查问题。 四、项目开发流程 1. ...
游戏拍卖系统是一种常见的在线交互平台,它允许玩家在虚拟世界中买卖游戏物品,提升游戏体验。本系统采用Java编程语言进行开发,不仅适用于毕业设计和课程设计,还能够实际运行,提供了一个完整的解决方案。通过分析...
ODBC是一种标准的接口,允许应用程序通过统一的方式访问各种数据库,包括SQL Server、Oracle、MySQL等。 2. **DAO(Data Access Objects)**: DAO是Microsoft的早期数据库访问技术,适用于Access数据库。在VC++中,...
MFC是微软提供的一种C++类库,它为Windows应用程序的开发提供了丰富的接口和功能,简化了窗口、菜单、对话框等界面元素的创建。通过MFC,开发者可以快速构建用户界面,并实现与操作系统底层的交互。 该“vc学生管理...
C++是一种强大的面向对象编程语言,它提供了丰富的库支持,如STL(Standard Template Library)和MFC(Microsoft Foundation Classes),为开发复杂系统提供了便利。在职工管理系统中,C++的主要应用体现在以下几个...
分布式温控系统是一种高效、灵活的温度控制方案,尤其适用于大型建筑或数据中心等环境,能够实现多区域的独立控制和整体协调。在这个“北邮-分布式温控系统”项目中,我们看到一个由QT实现的实例,这为学生提供了...
VC++是微软公司推出的一种集成开发环境,用于编写使用C++语言的Windows应用程序。它集成了编译器、调试器和其他工具,方便开发者进行高效编程。在酒店管理系统中,VC++的优势在于其强大的图形用户界面(GUI)设计...
4. 多线程支持:使用std::thread实现并发处理,提高系统性能。 5. 文件I/O操作:读写数据库或配置文件,使用fstream库进行文件操作。 五、学习与实践 理解并掌握这个C++源代码,对于学习者来说,不仅可以提升C++...
7. **多线程**:如果系统需要并行处理任务,如批量数据导入或并发查询,C++的多线程支持可以帮助提升性能。 总的来说,“学生基本信息管理系统”是一个综合运用了C++编程语言、面向对象设计、数据库技术、图形用户...
5. **LINQ**:C#中的语言集成查询,提供了一种简洁的查询数据的方式,支持数据库操作和集合操作。 6. **事件和委托**:事件用于在对象之间进行通信,委托是类型安全的函数指针,可以将多个方法连接到同一事件。 7....
本发明引入监听机制,仅关注活跃连接,并利用线程池技术,预创建工作线程,降低新连接建立时的性能影响,提高系统整体性能。 通过这些技术创新,本发明提供了一种大规模实时数据流的一体化处理、转发和存储方案,...
本文将详细介绍一个利用JAVA编程语言与SQL数据库技术构建的学生信息管理系统,旨在帮助读者理解如何将这两种技术有效地结合,实现高效的数据存储和处理。 首先,JAVA作为一款跨平台的面向对象编程语言,因其强大的...