更新时间:2025-08-04 GMT+08:00
分享

支持的场景和受限场景

并行查询支持的场景

表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 并行查询受限场景说明

受限场景

说明

语句

  • 非查询语句
  • PREPARE STATEMENT预处理语句
  • 查询表为系统表/临时表/非INNODB表
  • 不能转换成SEMIJOIN的子查询
  • 不满足ONLY_FULL_GROUP_BY
  • HASH JOIN溢出到磁盘
  • 加锁查询,如SERIALIZABLE隔离级别,FOR UPDATE/SHARE LOCK
  • 递归查询
  • WITH ROLLUP
  • 存在HIGH_PRIORITY关键字
  • 执行结果返回0行数据(执行计划显示: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的列,并且这些列能被优化为常量。
  • 存储过程

触发器

不支持触发器。

索引

  • 空间索引
  • 使用全文索引
  • 使用索引归并INDEX MERGE

函数

窗口函数

Spatial相关函数(如SP_WITHIN_FUNC等)

用户自定义函数

ref函数(VIEW_REF, OUTER_REF, AGGREGATE_REF)

user相关函数(user, current_user, session_user, system_user等)

空间关系函数(MBRContains,MBRCoveredBy,MBRCovers,MBRDisjoint,MBREquals,MBRIntersects, MBROverlaps, MBRTouches,MBRWithin)

ST_开头的函数均不支持。

不支持空间函数(GIS):GeomCollection、GeometryCollection、LineString、MultiLineString、MultiPoint、MultiPolygon、Polygon、ST_Distance、Point

不支持加密与哈希函数:SHA,SHA1,SHA2,MD5

不支持锁与同步函数: get_lock、is_free_lock、is_used_lock、release_lock、release_all_locks、sleep

不支持如下函数:

  • extractvalue
  • PS_CURRENT_THREAD_ID()、PS_THREAD_ID(CONNECTION_ID())
  • WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS
  • UNCOMPRESS(COMPRESS())
  • STATEMENT_DIGEST_TEXT
  • BINARY、CONVERT
  • generated column、BLOB、TEXT、JSON和GEOMETRY
  • GROUP_CONCAT
  • JSON_ARRAYAGG/JSON_OBJECTAGG
  • STD/STDDEV/STDDEV_POP
  • VARIANCE/VAR_POP/VAR_SAMP
  • BIT_AND 、BIT_OR and BIT_XOR
  • set_user_var
  • rand(不含参数的除外)
  • json_*(如json_length,json_type等)
  • st_distance
  • xml_str
  • weight_string
  • row_count

并行查询与串行执行不兼容场景说明

  • 错误或者告警提示次数可能会增多

    对于在串行执行中出现错误/告警提示的查询,在并行执行情况下,每个工作线程可能都会提示错误/告警,导致总体错误/告警提示数会增多。

  • 精度问题

    并行执行的执行过程中,当select的内容是函数类型时,会比非并行执行多出中间结果的存储过程,可能会导致浮点部分精度差别,导致最终结果有细微的差别。

  • 截断问题

    并行执行的执行过程中,当select的内容是函数类型时,会比非并行执行多出中间结果的存储过程。在这个过程中,需要缓存函数的计算结果,可能出现截断(一般是类型转换导致的,例如浮点数类型转为字符串等), 导致最终结果与串行结果有差别。

  • 结果集顺序差别

    因为是多个工作线程执行查询,返回的结果集可能与非并行执行顺序不一致。在具有LIMIT查询的情况下,更容易出现与串行结果顺序不同的现象。对于不可见字符,当MySQL判断多个不可见字符相等时,可能会出现结果集顺序不同,或者group by字段不同的现象。

  • union all结果集差别

    union all会忽略其中的排序算子,并行执行下返回的结果集顺序可能与非并行不一致。在有limit查询的情况下,会出现结果集不同的现象。

相关文档