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

特性使用约束

目前,并行执行在使用过程中存在一些限制,后续会逐步进行解决。

不适用并行执行的情况

下列的查询语句不支持并行执行:

  • 非查询语句
  • 窗口函数
  • 触发器
  • Prepared Statements
  • 空间索引
  • 查询表为系统表/临时表/非Innodb表
  • 使用全文索引
  • 存储过程
  • 不能转换成semijoin的子查询
  • 不满足only_full_group_by
  • 使用索引归并Index merge
  • 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的列,并且这些列能被优化为常量
  • generated column、BLOB、TEXT、JSON和GEOMETRY
  • Spatial相关函数(如SP_WITHIN_FUNC等)
  • aggregation(distinct),如sum(distinct)、avg(distinct)、count(distinct)
  • 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
  • get_lock
  • is_free_lock,is_used_lock,release_lock, release_all_locks
  • sleep
  • xml_str
  • weight_string
  • ref函数(VIEW_REF, OUTER_REF, AGGREGATE_REF),
  • SHA,SHA1,SHA2,MD5
  • row_count
  • user相关函数(user, current_user, session_user, system_user等)
  • 函数extractvalue
  • 函数GeomCollection,GeometryCollection,LineString,MultiLineString,MultiPoint,MultiPolygon,Polygon
  • 函数MASTER_POS_WAIT
  • 空间关系函数(MBRContains,MBRCoveredBy,MBRCovers,MBRDisjoint,MBREquals,MBRIntersects, MBROverlaps, MBRTouches,MBRWithin)
  • 函数Point
  • 函数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
  • ST_开头的函数匀不支持

与串行执行结果可能不兼容

并行执行的执行结果可能存在与串行执行不兼容的情况,主要表现在:

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

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

  • 精度问题

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

  • 截断问题

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

  • 结果集顺序差别

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

  • union all结果集差别

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

分享:

    相关文档

    相关产品