sql慢查询优化

业务场景

线上订单列表分页查询,老写法:

sql 复制代码
select * from order 
where user_id=? and create_time between ? and ? 
order by create_time desc 
limit 10000,10

问题

• limit 偏移量太大,数据库要扫描前10000行再丢弃,极慢

• 只有单列索引,排序触发 Using filesort

• 接口响应3~5秒,频繁超时

优化方案

  1. 建联合索引

    idx_user_createtime (user_id, create_time, id)

  2. 改成游标分页(正确逻辑)

    第一页正常:

sql 复制代码
select id,xxx from order 
where user_id=? 
order by create_time desc,id desc 
limit 10

下一页带上一页最小时间+最小id,用 id < last_id

(因为是倒序:时间从新到旧、id从大到小)

sql 复制代码
select id,xxx from order 
where user_id=? 
and create_time < last_create_time 
and id < last_id
order by create_time desc,id desc 
limit 10

核心原理

倒序分页:desc 用 id < 上页最后一条id

正序分页:asc 用 id > 上页最后一条id

  1. 去掉 select *,只查必要字段

优化效果

SQL从3秒多降到10ms内,接口超时全部消失。

我给你一句面试口述原话,直接背:

当时线上订单列表用limit大偏移分页,越往后越慢,还触发了文件排序。我先建了user_id+create_time联合索引,然后把大偏移limit改成游标分页,倒序查询用id小于上一页最后一条id做翻页,避免数据库扫描大量无效数据,同时精简查询字段,优化后耗时从3秒多降到十几毫秒。

相关推荐
聚美智数12 分钟前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
JavaPub-rodert19 分钟前
Go 后台如何同时兼容 MySQL、PostgreSQL、SQLite 和 SQL Server?从 ShiyuAdmin 看 GORM 多数据库适配
数据库·mysql·postgresql·golang·javapub·王仕宇
瀚高PG实验室41 分钟前
SQL优化案例:存储过程、复杂SQL拆成简单SQL提升整体性能
数据库·sql·postgresql·瀚高数据库
Wang's Blog1 小时前
PostgreSQL笔记36:执行计划基础解读与优化器成本模型
数据库·笔记·postgresql
Wang's Blog1 小时前
PostgreSQL笔记35:索引常见问题诊断与解决方案全景解析
数据库·笔记·postgresql
LayZhangStrive1 小时前
后端通识 - 后端开发职位接触的开发流程
数据库·prd·技术方案·库表设计·后端开发流程
爱吃火鸡面呀2 小时前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
奥莱维2 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
牛大兵2 小时前
机顶盒获取局域网已经使用IP,开放的端口号,扫描摄像头,NAS,共享主机等开机自启局域网全量扫描工具
数据库·网络协议·tcp/ip
知行产研2 小时前
中国矿山无人驾驶出海的三重门
数据库·mysql·php