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条数据会退出查询