tidb 索引选择

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.1.3
【复现路径】做过哪些操作出现的问题
【遇到的问题:采用一地两中心,建设主通过ticdc到从,在监控中发现一个慢语句,分别在主,和从中 explain analyze 发现索引选择不一致,相差较大】
主:


从:

where语句 如下 :

WHERE
  (
    district_id LIKE '130982207%'
    OR district_id = '130982501205'
  )
   AND p.area_id = '1309'
  AND p.birthday >= '2024-01-01'
  AND p.birthday <= '2024-01-31 23:59:59'
 
  AND p.is_deleted != 1
  AND p.create_type_code = 2
  AND 1 = 1
ORDER BY
  p.entering_time DESC
LIMIT
  20 OFFSET 0;

请问下,这个怎样优化,让主库中命中正确的索引。

会不会是因为你第一个p .birthday>='2024-01-01’不标准导致的,改成p .birthday>='2024-01-01 00:00:00’试试呢

不是,两个中心的数据是一模一样。在执行的时候索引选择不一样,我刚才按照你说的调整sql语句执行,没有变化

涉及的表手动analyze下试试呢

执行前已经手动执行 analyze table

不行做个SQL执行计划绑定吧

从库版本和主库一样吗?
不行主库加上 IGNORE_INDEX(p ,area_id +entering_time字段上的索引)或指定 FORCE_INDEX(p,area_id +birthday 字段上的索引)吧

是有效过,但是研发侧需要改造比较大。 主从数据一致,配置 从库要低些,从库主要用户bi和报表

我们用过 FORCE_INDEX

其实研发测不用改SQL,参考这里数据库层面绑定下执行计划就可以
https://docs.pingcap.com/zh/tidb/stable/sql-plan-management#执行计划绑定-sql-binding

我绑定试试,没有做过,绑定执行计划这块有经验分享么,需要注意那些,因为是生产,比较谨慎

我们这边用的挺多的,没遇到什么问题,绑定的执行计划也可以随时关闭或者删除
可以参考下社区的使用案例

1 个赞

感谢,我在尝试

更新统计信息 不行重新建索引

版本一致的话,确实不好确定问题在哪,也可以用绑定执行计划的方式。

嗯我先绑定下执行计划试试

我遇到过类似的问题,主从执行计划不一致,是因为主库是从低版本升级上来了,默认没有开启索引合并

统计信息更新下, 或可解决问题。 优化器怎么选择有的时候还真是不容易理解,慢慢研究下吧。

执行计划绑定

感谢各位,执行绑定计划解决

1 个赞