更新时间:2024-09-11 GMT+08:00
分享

注意事项

  • 并行查询特性当前处于公测阶段,建议在测试环境使用。
  • 云数据库GaussDB(for MySQL)的引擎版本需要为MySQL 8.0.22及以上。
  • 只读节点和主节点均支持并行查询,由于并行查询对计算资源(CPU、内存等)比较消耗,考虑到实例稳定性,云数据库GaussDB(for MySQL)的内核版本为2.0.42.230600及以上时,并行查询默认在主节点不生效,如需使用可联系客服人员开启。
  • 并行查询支持的场景:
    • 支持全表扫描、索引扫描、索引范围扫描、索引逆序扫描、索引点查询、索引下推等。
    • 支持单表查询、多表JOIN、视图VIEW、子查询,部分CTE查询等。
    • 支持多种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聚合函数需关闭“innodb_parallel_select_count”才能并行执行。

    • 支持非分区表查询、分区表单分区查询。
    • 支持排序ORDER BY、分组GROUP BY/DISTINCT、分页LIMIT/OFFSET、过滤WHERE/HAVING、列投影等。
    • 支持UNION/UNION ALL查询。
    • 支持EXPLAIN查看并行执行计划多种方式,包括传统EXPLAIN、EXPLAIN FORMAT=TREE、EXPLAIN FORMAT=JSON等。
  • 并行查询不支持的场景:
    • 非查询语句
    • 窗口函数
    • 触发器
    • 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查询的情况下,会出现结果集不同的现象。

相关文档