mysql order by limit 1和max的比较及说明

 更新时间:2025年09月12日 09:20:02   作者:hammring  
使用ORDER BY + LIMIT 1和MAX查询最大值时,ORDER BY + LIMIT 1更快,因主键索引有序,ORDER BY在找到第一条数据后停止,而MAX直接通过索引获取最大值,无需遍历表,执行计划显示前者使用索引排序,后者利用索引优化直接返回结果

在一次数据的需求中,去用order by+limit 1和 max两种方式求数据的最大值时,发现在同一过滤条件下order by limit 1执行时间要比max快。然后从一下两个角度对问题进行来思考。

1.查看执行计划

  • a.max查询计划

  • b.order by+limit 1查询计划

其中Extra是指执行情况的描述和说明。max的extra对应的值是 Select tables optimized away

order by + limit 的extra选项对应的值是 Using index

extra项解释:

Select tables optimized away:

使用某些聚合函数(比如 max、min)来访问存在索引的某个字段

来自于mysql官网对Select tables optimized away的描述:

For explains on simple count queries (i.e. explain select count(*) from 
people) the extra section will read "Select tables optimized away.
" This is due to the fact that MySQL can read the result directly from
 the table internals and  therefore does not need to perform the select.

Using index:直接在主键索引上完成查询和所有数据的获取。

2.order by和where的执行顺序

是否是先做的order by,后使用where过滤。

结论:因为max和order by+limit 1都是使用的主键值进行查询,而主键在mysql中是b+树。在叶子节点主键id本身就是按从小大的顺序排列的。所以在查询中会出现以下两种情况:

a.如果是查询普通列(非主键且该值没有索引列)条件,max()的查询速度要优于order by+limit 1,原因是从explain的执行计划中可以看出:order by+limit 1使用了索引,而使用max根本没有遍历表或索引就返回数据了

b.如果是主键值的查询可以分两种情况来讨论:

1.)如果是max()和order by速度的比较

max()的速度要比order by快,order by会把所有查询到的结果并展示出来。

select max(id) from  table_name:
select id  from  table_name  order by id desc;

2.)如果是max()和order by+limit 1 速度的比较

order by+limit 1会在查到第一条数据时返回结果。而不是对整个结果进行排序。

如果使用索引来完成排序,这将非常快。

如果你将LIMIT row_count子句与ORDER BY子句组合在一起使用的话,一旦找到第一个row_count之后,MySQL不会对结果集的任何剩余部分进行排序。

这种行为的一种表现形式是,一个ORDER BY查询带或者不带LIMIT可能返回行的顺序是不一样的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL的commit是如何commit源码解析

    MySQL的commit是如何commit源码解析

    这篇文章主要为大家介绍了MySQL的commit是如何commit源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • ubuntu20.04配置mysql8.0的实现步骤

    ubuntu20.04配置mysql8.0的实现步骤

    本文主要介绍了ubuntu20.04配置mysql8.0的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 浅析MySQL 锁和事务

    浅析MySQL 锁和事务

    这篇文章主要介绍了MySQL 锁和事务的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • MySQL半同步复制原理配置与介绍详解

    MySQL半同步复制原理配置与介绍详解

    这篇文章主要介绍了MySQL半同步复制原理配置与介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • MySQL 表数据的导入导出操作示例

    MySQL 表数据的导入导出操作示例

    这篇文章主要介绍了MySQL 表数据的导入导出操作,结合实例形式分析了MySQL 表数据的导入导出操作基本命令、使用方法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • mysql分表分库的应用场景和设计方式

    mysql分表分库的应用场景和设计方式

    为大家讲述一下在mysql在什么到时候需要进行分表分库,以及现实的设计方式。
    2017-11-11
  • mysql8.0配置文件my.ini详解

    mysql8.0配置文件my.ini详解

    这篇文章主要介绍了mysql8.0配置文件my.ini,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL中Join的算法(NLJ、BNL、BKA)详解

    MySQL中Join的算法(NLJ、BNL、BKA)详解

    这篇文章主要介绍了MySQL中Join的算法(NLJ、BNL、BKA)详解,Join是MySQL中最常见的查询操作之一,用于从多个表中获取数据并将它们组合在一起,本文将探讨这两种算法的工作原理,以及如何在MySQL中使用它们
    2023-07-07
  • Mysqli基础知识

    Mysqli基础知识

    本文给大家讲述的是Mysqli的基础知识,非常的浅显易懂,有需要的小伙伴就可以参考下。
    2015-07-07
  • Windows下安装MySQL 5.7.17压缩版中遇到的坑

    Windows下安装MySQL 5.7.17压缩版中遇到的坑

    最近发现原来好端端的MySQL突然间不能用了,无奈只能重新下载了最新的MySQL 5.7.17 Community 压缩版 for Windows 64-bit。但在安装过程中遇到了一些意外的问题,通过查找相关资料也解决了,所以想着总结出来,方便需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-01-01

最新评论