db

order优化

数据库

Posted by Secssion on January 8, 2024

1. 现象

select *  from example_table where userId=1 and date=20240108 order by time limit 100 offset 2 
  1. 数据库查询某个用户在某天的记录超时,该用户的总记录在几十万条
  2. 已存在索引query –(userId)

2. 该条数据执行过程

  1. 从索引query找到第一满足userId=1记录的主键id
  2. 到主键id中取出整行,判断该行的data是否为20240108,如果满足条件则匹配中该行
  3. 重复执行1、2,获取到所有符合userId=1 and date=20240108的数据
  4. 对这些数据按时间排序
  5. 取结果的前100条数据

3. 优化

  1. 从上面可以看出,为查询出100条数据,需要将所有的数据都查询出来,并将所有的数据按time字段排序
  2. 增加query2索引(userId,date,time)
  3. 考虑到索引字段也会按顺序存储,所以通过query2查询(userId,date)得到的数据本身按time排序

3.1. 优化后执行过程

  1. 从索引query2找到第一满足(userId=1 and date=20240108)记录的主键id
  2. 重复执行1,获取到100条数据会退出查询