两条查询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
- sql2
执行计划一样
关联知识
- 普通索引上的聚簇索引(ID)是排序的
- 如果查询字段不是覆盖索引需要回表
- 根据普通索引拿到聚簇索引(ID集合)后,是一条一条去回表查询的
原因分析
基于关联知识
sql1拿到排序后的ID集合后,一条一条根据ID加上非索引查询字段,只要查到满足要求的数据就终止查询
sql2需要查询所有数据,再比对所有数据的ID大小
因此时间差异在回表的次数上