跨库 order by 主键字段 时 tiflash执行计划 走了tikv的索引

【TiDB 使用环境】生产环境
【TiDB 版本】7.5.6
【操作系统】centos7
【部署方式】私有部署
【集群数据量】1T
【集群节点数】8
【问题复现路径】 use 别的数据库 。跨库执行 order by 主键
EXPLAIN SELECT tt.* FROM (SELECT /+read_from_storage(tiflash[m])/ m.id, m.promote_platform_type,…, m.ad_play_over_rate_within_thirty_d FROM middleground.middle_data_salesman AS m WHERE m.status=1 AND m.deleted=0 AND m.relate_shop_salesman_name LIKE CONCAT(‘%’, ‘天奇测评’, ‘%’) ) AS tt ORDER BY tt.id DESC LIMIT 20 ;

Warning Code : 1815
*There are no matching table names for (m) in optimizer hint /*+ READ_FROM_STORAGE(tiflash[m]) /. Maybe you can use the table alias name

   EXPLAIN  SELECT /*+read_from_storage(tiflash[m])*/         m.id,         m.promote_platform_type,  ... , m.ad_play_over_rate_within_thirty_d         FROM         middleground.middle_data_salesman AS m         WHERE m.status=1 AND m.deleted=0                                                                                   AND m.relate_shop_salesman_name  LIKE  CONCAT('%', '天奇测评', '%')                                                                                                                                                                                                           ORDER BY                                     id DESC  LIMIT 20 ;

这样也不行

只有用驱动表所在的库才行 。

去掉order by 主键字段是可以走tiflash 的。

有order by 主键 ,去掉limit 20 也是正常的

只有limit 没有 order by id 也能走tiflash , 就是组合一起 就不行了

order by 非索引第一列才能走tiflash

跨库的表不用别名才行 。
SELECT /+ read_from_storage(tiflash[middleground.middle_data_salesman])/ id, promote_platform_type ,… , ad_play_over_rate_within_thirty_d
FROM middleground.middle_data_salesman WHERE STATUS=1 AND deleted=0
AND relate_shop_salesman_name LIKE CONCAT(‘%’, ‘天奇测评’, ‘%’) ORDER BY id DESC LIMIT 20 ;

【遇到的问题:问题现象及影响】 预期是按hint 强制走tiflash 的 0.几秒 , 实际走了tikv 需要十多秒
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

/*+read_from_storage(tiflash[middleground.m])*/
显式地指定数据库名试试

不行

注意 hint 的语法格式/+ xxxxxxx/ ,+号后边有空格的
hint 语法写对后,如果走不上,一般是会抱 warning 的

跟这个没关系

跨库的表不用别名才行 。
SELECT /+ read_from_storage(tiflash[middleground.middle_data_salesman]) / id, promote_platform_type ,… , ad_play_over_rate_within_thirty_d
FROM middleground.middle_data_salesman WHERE STATUS=1 AND deleted=0
AND relate_shop_salesman_name LIKE CONCAT(‘%’, ‘天奇测评’, ‘%’) ORDER BY id DESC LIMIT 20 ;

这样用了子查询时执行计划 走的 tikv 是有问题的 :
EXPLAIN SELECT tt.* FROM (SELECT /+read_from_storage(tiflash[middleground.m])/ m.id, m.promote_platform_type, m.ad_play_over_rate_within_thirty_d
FROM middleground.middle_data_salesman AS m WHERE m.status=1 AND m.deleted=0
AND m.relate_shop_salesman_name LIKE CONCAT(‘%’, ‘天奇测评’, ‘%’) ) AS tt ORDER BY tt.id DESC LIMIT 20 ;

不用子查询的话 这样是可以走tiflash的 :
EXPLAIN SELECT /+read_from_storage(tiflash[middleground.m])/ m.id, m.promote_platform_type, m.ad_play_over_rate_within_thirty_d
FROM middleground.middle_data_salesman AS m WHERE m.status=1 AND m.deleted=0
AND m.relate_shop_salesman_name LIKE CONCAT(‘%’, ‘天奇测评’, ‘%’) ORDER BY id DESC LIMIT 20 ;

order by id 改成 order by id+0 试试,这个应该是 order by 的一个优化,+0 隐式转换下

或者 order by id 后面再加一个不影响查询结果的无关列,再或者提高 limit 的数量,比如 200,应该也会影响执行计划

之前做过绑定执行计划 , 删掉那个绑定执行计划就正常了。 还是要用 /+read_from_storage(tiflash[middleground.m]) / ,别的库好像不需要带库名奇怪 。

test库 正常,别的库名也正常的 是不是middleground 库名 是tidb的保留关键字?
EXPLAIN SELECT tt.* FROM (SELECT /+read_from_storage(tiflash[m])/m.id ,m.relate_shop_salesman_id
FROM
test.middle_data_salesman AS m
WHERE
m.status = 1
AND m.deleted = 0
AND m.relate_shop_salesman_name LIKE CONCAT(‘%’, ‘澳门小绵羊’, ‘%’)
) AS tt
ORDER BY tt.id DESC LIMIT 20;

middleground 就不行 hint里面必须加上库名