PolarDB新增支持慢SQL(本文所指的慢SQL为执行时间超过5秒的SQL)改写功能,能够通过内置的优化引擎自动抓取并改写慢SQL,而无需您手动修改业务端的代码或配置,来提高SQL执行效率。

前提条件

  • 集群所在地域需为如下地域之一:

    华东1(杭州)、华东2(上海)、华北2(北京)、华南1(深圳)、中国(香港)。

  • 需为PolarDB MySQL5.6、5.7或8.0集群版
  • 集群创建时间需在2021年03月16日及以后。
    说明 针对创建时间在2021年03月16日之前的集群,如需使用该功能,请提交工单联系技术支持。

适用场景

PolarDB会在如下场景中使用慢SQL改写功能,来优化集群性能:
  • 索引选择不当
    一般情况下数据库内置的优化器会优先选择ORDER BY里的字段作为索引的选择参考,但有时ORDER BY里的字段推荐的索引并不是最优索引,从而影响查询效率。为规避该问题,PolarDB支持通过如下两种方式来自动改写SQL:
    • 在SQL语句中添加FORCE INDEX Hint。

      例如,将SELECT * FROM table1改写成SELECT * FROM table1 FORCE INDEX (index_name) ...来强制优化器选择目标索引。

    • ORDER BY 子句改写成等价的新语句。

      例如,将ORDER BY [col1]改写成 ORDER BY [col1] IS NOT NULL, [col1] ,来避免优化器在索引选择时受ORDER BY后的字段影响。

  • 子查询

    PolarDB通过尝试将子查询改写成JOIN语句,让数据库在JOIN过程中使用索引来提升性能。

  • 低负载时的慢SQL

    在数据库的CPU负载较低的情况下,若某些SQL的执行用时仍然超过几十秒,PolarDB会在这些慢SQL语句中加入PARALLEL Hint,来自动开启并行查询,提高执行效率。

    例如,将SELECT * FROM t1;改写为SELECT /*+PARALLEL(8)*/ * FROM t1;,使得数据库由使用单线程执行改为使用8个线程并行执行。

  • WHERE语句

    PolarDB可以将WHERE语句中的谓词下推到下游的算子中来执行,从而过滤未被使用的数据,减少JOIN的数据量,实现查询效率的提升。

工作原理

开启慢SQL改写功能后,PolarDB会自动抓取执行时间超过5秒的SQL(即慢SQL),离线分析其中哪些SQL是可以通过改写来优化的,备用(Standby)计算节点(上面有完整的元数据信息和表统计信息,数据分布与生产环境一样,但不会影响生产)会对这些SQL进行优化验证,对于确实达到优化效果的SQL,在Proxy转发该SQL到后端节点执行之前,PolarDB会自动改写这些SQL,具体改写步骤如下:
  1. 将原SQL转化成关系代数。
  2. 对关系代数应用公认的等价变换来找到最优的执行计划。
  3. 将执行计划转化成关系代数。
  4. 将关系代数再转化成SQL。

同时,PolarDB可以从如下两方面保证SQL改写前后逻辑等价性和查询结果的一致性:

  • 逻辑等价

    从上述PolarDB改写慢SQL的步骤中,可以看出SQL语句和关系代数间是支持互相转化的,能够保证SQL改写前后的逻辑等价。

  • 结果一致

    改写慢SQL前,PolarDB会先离线分析和对比每个查询模板优化前后的结果集行列信息,只有当查询模板优化前后的结果集行列信息完全一致时,PolarDB才会在这些查询模板上应用SQL改写功能,保证了查询结果一致性。

如何使用

若集群满足前提条件,您可以在目标集群的基本信息页,单击目标集群地址的编辑配置,在弹出的对话框中打开或关闭慢SQL改写功能的开关。

1