order by 使用联合索引疑似未生效

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.0
  • 【问题描述】:

表user_topic有字段topic_ic和score建立联合索引 idx_score (topic_id,score)

select * from user_topic where topic_id in (29,31) limit 1;
这条语句命中索引 符合预期

select * from user_topic where topic_id in (29,31) order by score limit 1;
加上order by score 速度非常慢 疑似未使用到idx_score索引。

image

image

  1. 这个是查询sql,麻烦执行下 explain analyze sql 的结果
  2. 检查下统计信息是否正常,可以手工收集统计信息后再执行下

https://docs.pingcap.com/zh/tidb/stable/statistics#统计信息简介


使用force index 也是一样的

  1. 执行计划是走了索引的
  2. 这两个 sql 耗时相差大,比较符合预期。
    (1) limit ,每个 tikv 中只需要找到任意满足条件的一行记录,即可返回,之后再 tidb中再取一个值即可
    (2) order by score limit 1, 每个 tikv 中 需要先排序,找出 score 最小的值,再用最小的值,再tidb中比较找出最小的值。 可以看到,tikv中排序需要扫描一遍扫有的记录,找出符合条件的值,会比较耗费时间。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。