同where条件,有的查询走索引(IndexLookup),有的时候扫表(TableReader)

【 TiDB 使用环境】生产环境
【 TiDB 版本】 v4.0.9
【复现路径】mysql客户端
【遇到的问题:问题现象及影响】
同样的查询语句,where条件一样(值不一样),有的查询走索引(IndexLookup),有的时候扫表(TableReader)
【资源配置】
【附件:截图/日志/监控】

重新手动收集下统计信息后看看呢

麻烦您说下我该如何提供您需要的信息,十分感谢

explain 并不是实际走的执行计划,实际走的可以看看慢SQL记录里有没有这个SQL,有相关执行计划。也可以explain analyze方式看看执行计划是什么样

您好,这是analyze信息:

count(*)一下.jpg那条件实际有多少条? 看着像统计信息问题,还是重新手动收集下在看看

实际只有1条数据

以下是tidb_slow_query.log的日志

select * from objects where bucketname='test' and name='Thumbnails/img2021/0319/0828158e.jpg';
# Time: 2022-12-06T17:42:25.922607919+08:00
# Txn_start_ts: 437864292124983326
# User@Host: root[root] @ 172.15.104.247 [172.15.104.247]
# Conn_ID: 55490
# Query_time: 27.998234246
# Parse_time: 0.000012787
# Compile_time: 0.000254719
# Rewrite_time: 0.000072921
# Cop_time: 27.942105545 Process_time: 415.546 Wait_time: 0.332 Request_count: 859 Total_keys: 254780341 Process_keys: 254775997
# DB: yig
# Is_internal: false
# Digest: 8e443b2ca62a8b5d75388a297da66ed3f020a0065d60caae6db17a132a36966e
# Stats: gc:437864279070212131
# Num_cop_tasks: 859
# Cop_proc_avg: 0.483755529 Cop_proc_p90: 0.555 Cop_proc_max: 0.839 Cop_proc_addr: 172.15.104.241:20160
# Cop_wait_avg: 0.000386495 Cop_wait_p90: 0.001 Cop_wait_max: 0.003 Cop_wait_addr: 172.15.104.242:20160
# Mem_max: 11133148
# Prepared: true
# Plan_from_cache: false
# Has_more_results: false
# KV_total: 416.411025455
# PD_total: 0.000002569
# Backoff_total: 0
# Write_sql_response_total: 0.000018356
# Succ: true
# Plan: tidb_decode_plan('vwfAMAkxNV84CTAJNTAJeWlnLmdjLm10aW1lOmRlc2MsIG9mZnNldDowLCBjb3VudDo1MAEpBSHgMjcuOTk2MDc3NzIycywgbG9vcHM6MwkxMC41OTE0Njg4MTEwMzUxNTYgTUIJTi9BCjEJMzFfMTcJBWxEZGF0YTpUb3BOXzE2CTQwNTUwGVYcNTM3OTQ2ODkVVgg4M
TIBgfBbcF90YXNrOiB7bnVtOiA4NTksIG1heDogODQwLjE3MTAxN21zLCBtaW46IDUxMC43MzbCtXMsIGF2ZzogNDg0Ljc3NTk0OG1zLCBwOTU6IDU5MC44MDAyNzhtcywBSlhfcHJvY19rZXlzOiAzNTU0OTEsIHA5NTYXACA0MTI5LCB0b3QFFyg6IDZtNTUuNTQ2cwkVIHdhaXQ6IDMzMgFUDHJwY18J
rAg3MywFDiU6ATQENi4BSRQ3MzYxMnMF3HhyX2NhY2hlX2hpdF9yYXRpbzogMC4wMH0JMjYuODUzIUkMMjUgSylLLDIJMTVfMTYJMV8wCaK5AT1mBDBuNVwYMCwgdGlrdilbEHtwcm9jIQsMOjgzOQHCOG1pbjowcywgcDgwOjUzNAETITwENTgFHihpdGVyczoyNDkzOCEUMGFza3M6ODU5fQlOL0EBBBg
KMwkxXzE1BacwMjU0NzkzMzQyCWxlKC5qAlgsIDIwMjItMTItMDYgMDk6MjQ6NDAuMAUBACkFNxAxNTI5NUkfhrkABDc3BaYuuQAINDgzFbkEMzUBC4K5ABg0CTEwXzE0OroAZHRhYmxlOmdjLCBrZWVwIG9yZGVyOmZhbHNlBagQNzQwMzGiqAAANUaoAAQ2OAGdJWEEMTkBC4KoAA==')
# Plan_digest: 62c16bc589067c967847e02f0e69d05dff227531c22874ede526fa204a76e77b

可以尝试的重新调整一下组合索引的顺序,看上去name 的选择度更好

目前是个联合索引(bucketname, name, version)

那请问这个问题该怎么解释呢?然后如何解决 or workaround 一下?线上环境改索引不太现实

加一个hint 强制走这个索引

只能先bind一下,强制走索引。具体还是要看下选择率,直方图之类的。

SHOW STATS_HISTOGRAMS

您好,您说的这个hint怎么加。。。用useindex?

您好,为什么同样的where条件,会引起选择率的问题,是什么原因引起的呢???明明where条件符合联合索引的前两个啊

https://docs.pingcap.com/zh/tidb/stable/optimizer-hints#force_indext1_name-idx1_name--idx2_name-

重新收集统计信息(注意表比较大的时候选择业务低峰期执行):


https://docs.pingcap.com/zh/tidb/stable/sql-statement-analyze-table#analyze

这个一般都是统计信息不准导致的,直方图。还有就是列倾斜比较严重。
楼上有大佬说了,你这个索引顺序,应该这样更好:name,bucketname。
可以新建一个索引,原来的先不动。

我觉得如果你这个表里面name字段的值基本都是不同的话,不需要联合索引,直接建一个name字段的索引就可以了,如果统计信息不准导致走不到索引的话,直接hint指定一下就可以 use_index

我觉得是不是因为两个sql的成本查询的问题导致的,因为优化器最终怎么查询还是要看两个的查询成本。
可以看一下两个的成本

您说的这个成本该怎么查看?