索引不生效

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题 从6.0.0升级到7.1.0
【遇到的问题:问题现象及影响】
所有的索引不生效了



不强制使用索引,就非常慢,大概三四秒,强制使用索引就几十毫秒

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

表的健康度是99,也做过表分析了,也重启过整个集群

explain analyze看下

强制加了索引explain analyze下看看

看着走索引没毛病啊,为啥优化器选择走tablerangescan啊。。。
你不加limit试下

explain format=‘verbose’ select * from 这个语句查询下代价呢? 是不是优化器任务不走索引的代价比较小

重建下索引试试

admin check index也可以试试

表里的数据大概有100亿行,重建索引,要好几天

  • 可能导致索引失效的场景
      1. 索引列不独立. 独立是指: 列不能是表达式的一部分, 也不能是函数的参数
      • 解决方案:
      1. 使用了左模糊
      1. 使用or查询的部分字段没有索引
      • 解决方案:
      1. 字符串条件为使用 ’ ’ 引起来
      • 解决方案: 添加 ’ ’ , 规范的编写 sql
      1. 不符合最左前缀原则的查询
      • 解决方案:
      1. 索引字段建议添加 NOT NULL 约束
      • 解决方案:
      1. 隐式转换导致索引失效
      1. 索引失效导致行锁升级为表锁
  • 索引类型(常用的6种):
      1. all
      1. index
      1. range
      1. ref
      1. ref_eq
      1. const

set global tidb_ddl_reorg_worker_cnt=10
set global tidb_ddl_reorg_batch_size=256
这两个参数调整大,能大幅增加建索引速度

1 个赞

新建一个其他的试试,等也是等着

show index from table;
按照mysql的经验,有可能是这张表频繁的删写,导致索引基数比较高。
优化器在判断时,认为走索引的代价比全表扫描高。

1 个赞