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

 更新时间:2026年02月06日 08:39:49   作者: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条,仍需处理全部数据。这种"先排序后截取"的机制导致:

  • 索引覆盖失效,触发临时表创建
  • 文件排序(filesort)消耗大量CPU/IO
  • 回表操作加剧随机IO压力

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

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可观察到:

  • 内层查询使用索引idx_stock_code_id完成倒序扫描
  • 外层查询仅对10条结果进行正序排序
  • 避免全表扫描(type=range)
  • 消除Using temporary/filesort

3. 性能对比

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

性能优化进阶

1. 索引优化策略

  • 复合索引设计:创建(stock_code, id)索引,使内层查询直接利用索引排序
  • 索引提示使用
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识别潜在问题:

  • type=ALL表示全表扫描,需优化索引
  • Extra=Using filesort提示需优化排序字段索引
  • rows值过大说明扫描数据过多

3. 服务器参数调整

  • 增大sort_buffer_size减少磁盘排序
  • 调整tmp_table_size避免临时表磁盘存储
  • 优化innodb_buffer_pool_size提升缓存命中率

特殊场景处理

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. 高并发场景优化

  • 避免长事务导致的锁竞争
  • 使用连接池控制并发度
  • 分区表优化(按stock_code分区)

总结

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

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

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

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

相关文章

  • MySQL Binlog 日志处理工具对比分析

    MySQL Binlog 日志处理工具对比分析

    这篇文章主要介绍了MySQL Binlog 日志处理工具对比分析的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-03-03
  • MySQL字符编码设置方法

    MySQL字符编码设置方法

    这篇文章主要介绍了MySQL字符编码设置方法的相关资料,需要的朋友可以参考下
    2016-05-05
  • Windows下MySQL8.0.11社区绿色版安装步骤图解

    Windows下MySQL8.0.11社区绿色版安装步骤图解

    在本教程中使用MySQL最新的MySQL服务8.0.11的社区绿色版本进行安装,绿色版为zip格式的包,安装步骤分为四大步骤,具体哪四大步骤大家跟随脚本之家小编一起学习吧
    2018-05-05
  • mysql case when group by 实例详解

    mysql case when group by 实例详解

    这篇文章主要介绍了mysql 中类似php switch case 的语句,需要的朋友可以参考下
    2018-01-01
  • 详细解读MySQL中的权限

    详细解读MySQL中的权限

    这篇文章主要介绍了MySQL中的权限,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,需要的朋友可以参考下
    2015-05-05
  • MySQL中WITH AS语句的使用方法举例

    MySQL中WITH AS语句的使用方法举例

    在MySQL中WITH AS语法用于创建一个临时的命名查询(也称为子查询),这些子查询可以在后续的查询中引用,从而简化查询语句的编写,这篇文章主要给大家介绍了关于MySQL中WITH AS语句的使用方法,需要的朋友可以参考下
    2024-06-06
  • mysql修改数据库默认路径无法启动问题的解决

    mysql修改数据库默认路径无法启动问题的解决

    这篇文章主要给大家介绍了关于mysql修改数据库默认路径无法启动问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • mysql5.6.8源码安装过程

    mysql5.6.8源码安装过程

    这篇文章主要介绍了mysql5.6.8源码安装过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • MySql8设置远程连接的实战记录

    MySql8设置远程连接的实战记录

    与SQL Server类似,MySQL在需要远程操纵其他电脑时,也需要对其做远程连接的相应设置,下面这篇文章主要给大家介绍了关于MySql8设置远程连接的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MySQL查询冗余索引和未使用过的索引操作

    MySQL查询冗余索引和未使用过的索引操作

    这篇文章主要介绍了MySQL查询冗余索引和未使用过的索引操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论