sqle
sqle copied to clipboard
mysql 规则 JOIN字段必须包含索引 优化
版本信息(Version)
main
问题描述(Describe)
两张表关联join,假设驱动表的连接字段是非索引字段,该条规则会误触发.无论驱动表连接字段有没有索引,驱动表走的都是全表扫描,所以规则只需要判断被驱动表连接字段是否是索引字段即可,不需要判断驱动表连接字段是不是索引字段.
截图或日志(Log)
如何复现(To Reproduce)
- 存在以下两张表
CREATE TABLE t1
(
c1 int,
c2 int,
INDEX (c1)
);
CREATE TABLE t2
(
c1 int,
INDEX (c1)
);
- 开启规则 JOIN字段必须包含索引,审核以下SQL
SELECT *
FROM t1
LEFT JOIN t2 ON t1.c2 = t2.c1;
- 审核结果触发 JOIN字段必须包含索引 规则,复现成功
问题原因
规则对驱动表连接字段检测是否是索引字段导致的
解决方案
参考: left/right join 不判断驱动表连接字段是否是索引字段,innner join 根据执行计划结果得出哪张表驱动表