Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL排序后取最后10条数据

MySQL排序机制之获取最后10条数据的正确方法

作者:detayun

在日志分析、最新数据展示等场景中,我们常需获取排序后的最后N条数据,传统思维认为直接使用ORDER BY ... DESC LIMIT N即可,但实测发现这种写法在大数据量下性能骤降,本文将深入解析MySQL排序机制,揭秘高效获取最后10条数据的科学方法,需要的朋友可以参考下

引言

在日志分析、最新数据展示等场景中,我们常需获取排序后的最后N条数据。传统思维认为直接使用ORDER BY ... DESC LIMIT N即可,但实测发现这种写法在大数据量下性能骤降。本文将深入解析MySQL排序机制,揭秘高效获取最后10条数据的科学方法。

问题本质:排序与分页的矛盾

当执行SELECT * FROM table ORDER BY id DESC LIMIT 10时,MySQL需完成全量排序后再截取前10条。若表有百万级数据,即使只需最后10条,仍需处理全部数据。这种"先排序后截取"的机制导致:

解决方案:子查询+双重排序

1. 基础写法

SELECT * 
FROM (
    SELECT * 
    FROM stock_stock_day_data 
    WHERE stock_code = '000001' 
    ORDER BY id DESC 
    LIMIT 10
) AS sub 
ORDER BY id ASC;

2. 执行计划分析

通过EXPLAIN可观察到:

3. 性能对比

方案执行时间临时表索引使用
直接排序55s需创建未使用复合索引
子查询法0.055s无需使用索引覆盖

性能优化进阶

1. 索引优化策略

SELECT * 
FROM (
  SELECT * 
  FROM stock_stock_day_data 
  FORCE INDEX (idx_stock_code_id)
  WHERE stock_code = '000001' 
  ORDER BY id DESC 
  LIMIT 10
) ...

2. 执行计划调优

通过EXPLAIN识别潜在问题:

3. 服务器参数调整

特殊场景处理

1. 超大结果集优化

使用变量缓存法避免全量排序:

SET @rownum := 0;
SELECT * 
FROM (
    SELECT *, @rownum := @rownum + 1 AS rownum
    FROM stock_stock_day_data 
    WHERE stock_code = '000001' 
    ORDER BY id DESC
) t1
WHERE rownum <= 10
ORDER BY id ASC;

2. 高并发场景优化

总结

高效获取最后10条数据需遵循"先定位后排序"原则:

  1. 使用子查询快速定位目标数据集
  2. 通过复合索引实现索引覆盖
  3. 外层查询仅对结果集进行二次排序
  4. 结合执行计划分析持续优化

通过索引优化、执行计划调优、服务器参数调整三管齐下,可使查询性能提升千倍。掌握这些核心方法,即可在百万级数据中实现毫秒级响应,真正实现"大数据,小延迟"的极致体验。

以上就是MySQL排序机制之获取最后10条数据的正确方法的详细内容,更多关于MySQL排序后取最后10条数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文