能修改SQL的join方式吗? 比如将hash join改为index join

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.2.3

可以参考这里修改及使用查询计划看一下:https://docs.pingcap.com/zh/tidb/v7.1/explain-joins#index-join

试了下,还是不行,执行计划如下:

这个sql执行早0.8秒左右,where条件去掉t1.deleted=0,查询就很快了,执行计划也变了,如下

为何去掉t1.deleted=0,查询就快了呢?还有优化方案吗?

mysql客户端默认去掉注释的,你得加–comments

1 个赞

1、你加hint以后,出现了warning:


2、hint不生效,可以查看一下这里: Optimizer Hints | PingCAP 文档中心

1 个赞

指定了–comments,还是有warning呢

mysql> show warnings;
±--------±-----±---------------------------------------------------------------------------------+
| Level | Code | Message |
±--------±-----±---------------------------------------------------------------------------------+
| Warning | 1815 | Optimizer Hint /*+ INL_JOIN(t, t1) / or /+ TIDB_INLJ(t, t1) */ is inapplicable |
±--------±-----±---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

INL_JOIN(t1)
这样试一下

一样的,join方式还是没有变化

查查表结构,字符集排序规则是不是一样的,关联字段是不是一样的,有没有对应的索引

有索引的,字符集也是一样的。where条件去掉t1.deleted=0,查询就很快了,执行计划也变了,如下

这就是走index join了,为啥 t1.deleted=0 这个条件导致走不了index join,不清楚

t1.delete=0去掉 语义变了吧,除了join列排序规则要一致,不走index join 有可能 t1是估算数据不准确

等大佬解答

deleted=0的数据占总表百分之多少啊?

t1表deleted=1占全表接近100%

可以建一个 t1 (newHouseUuid,deleted )的联合索引试试看

联合索引还是不行。
t1.deleted字段是bit类型,t1.deleted改为tinyint类型之后,最终测试是index scan的,不清楚为何会这样

查表结构,再看SQL