一、问题
出现报错:1105 - runtime error: index out of range [1] with length 1,这个在tidb里是一种很常见的bug,是由于执行计划不对导致的查询报错,但是我有三个tidb,其中两个执行计划都是对的(显然这有点问题,但这不是本次讨论的重点),这样就比较好排查了。
二、排查
通过explain对比执行计划,发现正常执行的left join是hash join,非正常执行的left join是index join,那这样就很好解决这个问题了,只需要通过hint来指定left join为hash join即可
三、解决
最初写法;
select /*+ HASH_JOIN(m1,m2) */
通过这样指定后,我们发现warning中提示There are no matching table names optimizer hint /*+ HASH_JOIN(m1, m2) */,这意味着我们的hint操作并没有奏效,那么这是为什么呢,仔细排查后发现,m1,m2并不在一个数据库中,这会造成优化器的误解,所以需要在hint中指定库名,它才能正确的执行hint
正确写法:
select /*+ HASH_JOIN(db1.m1,db2.m2) */