
# 并行查询简介
#### 什么是并行查询
云数据库 TaurusDB支持并行执行的查询方式，用以降低分析型查询场景的处理时间，满足企业级应用对查询低时延的要求。
并行查询的基本实现原理是将查询任务进行切分并分发到多个CPU核上进行计算，充分利用CPU的多核计算资源来缩短查询时间。并行查询的性能提升倍数理论上与CPU的核数正相关，也就是说并行度越高能够使用的CPU核数就越多，性能提升的倍数也就越高。
下图是使用CPU多核资源并行计算一个表的count(\*)过程的基本原理：表数据进行切块后分发给多个核进行并行计算，每个核计算部分数据得到一个中间count(\*)结果，并在最后阶段将所有中间结果进行聚合得到最终结果。具体如下：
图1并行查询原理图   
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000001882571536.png "点击放大")
#### 应用场景
并行查询适用于大部分SELECT语句，例如大表查询、多表连接查询、计算量较大的查询。对于非常短的查询，效果不太显著。
- 轻分析类业务 报表查询通常SQL复杂而且比较耗费时间，通过并行查询可以加速单次查询效率。
  
- 系统资源相对空闲 并行查询会使用更多的系统资源，只有当系统的CPU较多、IO负载不高、内存够大的时候，才可以充分使用并行查询来提高资源利用率和查询效率。
  
- 数据频繁查询 针对数据密集型查询，通过并行查询，可以提高查询处理执行效率，减少网络流量和计算节点的压力。
  
 
#### 支持的场景和受限场景
- [支持的场景]
  表1并行查询支持的场景 
  | 功能场景        | 说明                                                                                                                                                                                                                 |
  |:---|:---|
  | 扫描          | 支持全表扫描、索引扫描、索引范围扫描、索引逆序扫描、索引点查询、索引下推等。                                                                                                                                                                             |
  | 查询          | 支持单表查询、多表JOIN、视图VIEW、子查询，部分CTE查询、非分区表查询、分区表单分区查询、UNION/UNION ALL查询等。                                                                                                                                               |
  | JOIN        | 支持BNL JOIN、BKA JOIN、HASH JOIN、NESTED LOOP JOIN、SEMI JOIN、ANTI JOIN、OUTER JOIN等。                                                                                                                                    |
  | 子查询         | 支持条件子查询、SCALAR子查询、部分关联子查询、非关联子查询、DERIVED TABLE等。                                                                                                                                                                   |
  | 数据类型        | 支持整型数据、字符型数据、浮点型数据、时间型数据等。                                                                                                                                                                                         |
  | 表达式运算       | 支持算术表达式计算（+、-、\*、%、/、\|、\&），条件表达式运算（\<、\<=、\>、\>=、\<\>、BETWEEN/AND、IN等）。                                                                                                                                           |
  | 逻辑运算        | 支持OR、AND、NOT等。                                                                                                                                                                                                     |
  | 一般函数        | 支持字符函数、整型函数、时间函数等。                                                                                                                                                                                                 |
  | 聚合函数        | 支持COUNT/SUM/AVG/MIN/MAX等。 注意： 对于含有COUNT聚合函数的SQL语句使用了InnoDB并行查询场景下，如果该SQL语句需要使用PQ，必须将"innodb_parallel_select_count"设置为off。 |
  | 排序/分组/分页/过滤 | 支持排序ORDER BY、分组GROUP BY/DISTINCT、分页LIMIT/OFFSET、过滤WHERE/HAVING、列投影等。                                                                                                                                               |
  | EXPLAIN     | 包括传统EXPLAIN，以及MySQL 8.0新引入的EXPLAIN FORMAT=TREE、EXPLAIN ANALYZE、EXPLAIN FORMAT=JSON，其中2.0.60.241200版本开始支持EXPLAIN ANALYZE。                                                                                           |
     
- [受限场景]
  表2并行查询受限场景说明 
  | 受限场景 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
  |:---|:---|
  | 语句   | - 非查询语句（DML、DDL）。  - PREPARE STATEMENT预处理语句。  - 存储过程/函数/触发器中的 SELECT 语句。  - 加锁查询，如SERIALIZABLE隔离级别，FOR UPDATE/SHARE LOCK。  - 查询表为非INNODB表/系统表/显式临时表。  - 不能转换成SEMIJOIN的子查询。  - 不满足ONLY_FULL_GROUP_BY。  - 递归查询(WITH RECURSIVE)。  - 包含 WITH ROLLUP 子句。  - 包含HIGH_PRIORITY/SQL_BUFFER_RESULT关键字。  - 点查或者优化阶段返回0行数据，对应的执行计划显示：EQ_REF, Zero limit, Impossible WHERE, Impossible HAVING, No matching min/max row, Select tables optimized away, Impossible HAVING noticed after reading const tables, no matching row in const table。  - 查询中包含 zerofill 的列，并且这些列能被优化为常量。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | 索引   | - 空间索引（SPATIAL INDEX）  - 全文索引（Full Text）                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
  | 函数   | - 窗口函数 (Window function)  - JSON 相关函数 (JSON_ARRAYAGG, JSON_OBJECTAGG, JSON_VALUE, JSON_VALID, JSON_LENGTH 等)  - 空间函数(GIS)(GeomCollection, GeometryCollection, LineString, MultiLineString, MultiPoint, MultiPolygon, Polygon 等)  - 空间函数 (ST_GeomFromText, ST_AsText, ST_Distance, ST_Intersects, ST_Contains, ST_Buffer, ST_Area, ST_WITHIN 等)  - 空间关系 (MBRContains, MBRCoveredBy, MBRCovers, MBRDisjoint, MBREquals, MBRIntersects, MBROverlaps, MBRTouches, MBRWithin 等)  - user相关函数 (user, current_user, session_user, system_user, current_role 等)  - XML 相关函数 (ExtractValue, UpdateXML)  - 线程 ID 函数 (PS_CURRENT_THREAD_ID, PS_THREAD_ID)  - 加密与哈希函数 (DES_DECRYPT, SHA, SHA1, SHA2, MD5, rand(不含参数的除外))  - 锁与同步函数 (get_lock, is_free_lock, is_used_lock, release_lock, release_all_locks, sleep)  - 返回值类型不支持的函数 (UNCOMPRESS, STATEMENT_DIGEST_TEXT)  - 部分聚合函数 (BIT_AND, BIT_OR, BIT_XOR, GROUP_CONCAT, STD, STDDEV, STDDEV_POP, VARIANCE, VAR_POP, VAR_SAMP)  - 其他系统函数 (set_user_var, WAIT_FOR_EXECUTED_GTID_SET, WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS)  - 用户自定义函数 (UDF)   |
     
#### 并行查询与串行执行不兼容场景说明
#### 错误或者告警提示次数可能会增多
对于在串行执行中出现错误/告警提示的查询，在并行执行情况下，每个工作线程可能都会提示错误/告警，导致总体错误/告警提示数会增多。
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002554358793.png "点击放大")
#### 精度问题
并行执行的执行过程中，当select的内容是函数类型时，会比非并行执行多出中间结果的存储过程，可能会导致浮点部分精度差别，导致最终结果有细微的差别。
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002523318870.png "点击放大")
#### 截断问题
并行执行的执行过程中，当select的内容是函数类型时，会比非并行执行多出中间结果的存储过程。在这个过程中，需要缓存函数的计算结果，可能出现截断(一般是类型转换导致的，例如浮点数类型转为字符串等), 导致最终结果与串行结果有差别。
#### 结果集顺序差别
因为是多个工作线程执行查询，返回的结果集可能与非并行执行顺序不一致。在具有LIMIT查询的情况下，更容易出现与串行结果顺序不同的现象。对于不可见字符，当MySQL判断多个不可见字符相等时，可能会出现结果集顺序不同，或者group by字段不同的现象。
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002523358868.png "点击放大")
#### union all结果集差别
union all会忽略其中的排序算子，并行执行下返回的结果集顺序可能与非并行不一致。在有limit查询的情况下，会出现结果集不同的现象。
