慢查-使用min(id)效率不如order by id limit 1的情况

87 阅读1分钟

两条查询sql

-- sql1:执行时间160ms
SELECT id
FROM table
WHERE mark = 0
  AND process_status = 0
  AND sharding_column = '202411'
ORDER BY id ASC
LIMIT 1;
    
-- sql2:执行时间2500MS
SELECT min(id)
FROM table
WHERE mark = 0
  AND process_status = 0
  AND sharding_column = '202411';

sql关联表信息

  • 数据量大概1500万
  • process_status是普通索引,mark和sharding_column不是主键索引

两条sql的执行计划

  • sql1

image.png

  • sql2

image.png

执行计划一样

关联知识

  • 普通索引上的聚簇索引(ID)是排序的
  • 如果查询字段不是覆盖索引需要回表
  • 根据普通索引拿到聚簇索引(ID集合)后,是一条一条去回表查询的

原因分析

基于关联知识
sql1拿到排序后的ID集合后,一条一条根据ID加上非索引查询字段,只要查到满足要求的数据就终止查询
sql2需要查询所有数据,再比对所有数据的ID大小
因此时间差异在回表的次数上