1. 现象
select * from example_table where userId=1 and date=20240108 order by time limit 100 offset 2
- 数据库查询某个用户在某天的记录超时,该用户的总记录在几十万条
- 已存在索引query –
(userId)
2. 该条数据执行过程
- 从索引query找到第一满足
userId=1
记录的主键id - 到主键id中取出整行,判断该行的data是否为
20240108
,如果满足条件则匹配中该行 - 重复执行1、2,获取到所有符合
userId=1 and date=20240108
的数据 - 对这些数据按时间排序
- 取结果的前100条数据
3. 优化
- 从上面可以看出,为查询出100条数据,需要将所有的数据都查询出来,并将所有的数据按time字段排序
- 增加query2索引
(userId,date,time)
- 考虑到索引字段也会按顺序存储,所以通过query2查询
(userId,date)
得到的数据本身按time排序
3.1. 优化后执行过程
- 从索引query2找到第一满足
(userId=1 and date=20240108)
记录的主键id - 重复执行1,获取到100条数据会退出查询