actiontech / sqle

一个支持多种不同类型数据库,覆盖事前控制、事后监督、标准发布场景,帮助您建立质量规范的SQL全生命周期质量管理平台
Mozilla Public License 2.0
1.42k stars 183 forks source link

mysql 规则 JOIN字段必须包含索引 优化 #2568

Open taolx0 opened 2 weeks ago

taolx0 commented 2 weeks ago

版本信息(Version)

main

问题描述(Describe)

两张表关联join,假设驱动表的连接字段是非索引字段,该条规则会误触发.无论驱动表连接字段有没有索引,驱动表走的都是全表扫描,所以规则只需要判断被驱动表连接字段是否是索引字段即可,不需要判断驱动表连接字段是不是索引字段.

截图或日志(Log)

如何复现(To Reproduce)

  1. 存在以下两张表
CREATE TABLE t1
(
    c1 int,
    c2 int,
    INDEX (c1)
);

CREATE TABLE t2
(
    c1 int,
    INDEX (c1)
);
  1. 开启规则 JOIN字段必须包含索引,审核以下SQL
SELECT *
FROM t1
         LEFT JOIN t2 ON t1.c2 = t2.c1;
  1. 审核结果触发 JOIN字段必须包含索引 规则,复现成功

问题原因

规则对驱动表连接字段检测是否是索引字段导致的

解决方案

参考: left/right join 不判断驱动表连接字段是否是索引字段,innner join 根据执行计划结果得出哪张表驱动表

变更影响面

受影响的模块或功能

外部引用的潜在问题或风险

版本兼容性

测试建议