mysql查询的时候没有加order by时的默认排序问题

有时候我们执行MySQL查询的时候,查询语句没有加order by,但是发现结果总是已经按照id排序好了的,难道MySQL就是为了好看给我们排序

mysql查询的时候没有加order by时的默认排序问题

如上图数据,是我查询了语句

SELECT * from employees WHERE first_name like “be%”;

看结果是按照emp_no排序,其中first_name上是有索引的。

首先我们需要搞清楚MySQL回表,回表是指在我们利用的索引树(比如上述语句用到的first_name字段索引)的数据不能满足我们select中选中的数据,因为first_name是二级索引(也可以说是非聚簇索引),该索引只能拿到emp_no,first_name字段值,索引select *查询的话就只能到主键索引所在的索引树上获取相应数据。

按照上述查询去first_name索引上匹配的话,我们匹配到的数据肯定是没法保证按照emp_no排序了,但是为啥最终我们看到的数据是按照emp_no排序了呢?其实这是mysql的mrr机制。

mrr想要达到的目的就是从磁盘的随机读变成顺序读,因为如果我们直接拿emp_no乱序的数据回表查询,那么就是一个随机读,这个性能是很差的,所以MySQL会在回表之前提前将emp_no数据排序好,这样回表就变成了顺序读,极大提高性能。

当我们将mrr关掉

set optimizer_switch=’mrr=off’;

再次执行

可以看到emp_no已经是乱序了

开启mrr后,我们来explain该查询语句,发现extra里显示了Using MRR

mysql查询的时候没有加order by时的默认排序问题

所以当我们期望查询的结果有序的时候,一定要在查询的语句中加上自己的order by,而不能因为默认排序了,就不加order by,因为MySQL的机制他是不定的。

Original: https://www.cnblogs.com/minjay/p/15598848.html
Author: minjay26
Title: mysql查询的时候没有加order by时的默认排序问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579838/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java函数式编程

    Java函数式编程 初探函数式编程【JavaScript篇】_哔哩哔哩_bilibili 三更草堂Up主。不会Lambda表达式、函数式编程?你确定能看懂公司代码?-java8函数…

    Java 2023年6月5日
    0100
  • 天池学习赛–贷款违约预测

    贷款违约预测 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这道赛题来引导大家了解…

    Java 2023年6月8日
    0121
  • Java面试题

    包含的模块 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring B…

    Java 2023年5月29日
    069
  • jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法

    一、简介 在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用。 包含Java开发者经常面对的几类问题: 语言 编译器 库 工具 运行时(JVM) 二、Lambda…

    Java 2023年5月30日
    094
  • 全链路追踪 & 性能监控工具 SkyWalking 实战

    Skywalking介绍 Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4…

    Java 2023年6月8日
    082
  • DC-1 靶机渗透

    DC-1 靶机渗透 概况: 下载地址 https://www.vulnhub.com/entry/dc-1,292/ 官方描述: DC-1 is a purposely built…

    Java 2023年6月6日
    071
  • HashMap源码及原理详解

    HashMap概要 基本属性 Node节点源码 TreeNode节点源码 容量初始化 容量为2的幂次方的好处 哈希的计算 哈希冲突 put – 添加元素 get &#8…

    Java 2023年6月9日
    095
  • Java多线程系列——计数器 CountDownLatch

    简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方…

    Java 2023年5月29日
    0101
  • 面试题:java线程的生命周期?线程的状态是如何转移的(马士兵讲解)

    线程的生命周期,状态是如何转移的 Thread类里有个枚举类: public enum State { //新建状态 NEW, //Runnable状态 RUNNABLE, //B…

    Java 2023年5月29日
    077
  • 【Java分享客栈】超简洁SpringBoot使用AOP统一日志管理-纯干货干到便秘

    前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧。 实现 本篇AOP统一…

    Java 2023年6月9日
    0101
  • js中$

    $符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的1、首先可以用来表示变量,比如变量 var s=’asdsd&…

    Java 2023年5月29日
    0100
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Java 2023年6月15日
    095
  • Class.getResource(“/”)之为什么需要”/”

    Class.getResource(“/”)之为什么需要”/” 结论 Class.getResource真正调用ClassLoade…

    Java 2023年6月7日
    078
  • Elasticsearch–Logstash定时同步MySQL数据到Elasticsearch

    Logstash是elastic技术栈中的一个技术。它是一个数据采集引擎,可以从数据库采集数据到es中。我们可以通过设置自增id主键或者时间来控制数据的自动同步,这个id或者时间就…

    Java 2023年6月13日
    071
  • 01-RocketMQ介绍

    一、MQ介绍 1、什么是MQ?为什么要用MQ? MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺…

    Java 2023年6月7日
    0138
  • 有意思的面试记录

    碰见一个很有意思的【百度面试】,和我好像hhh链接:https://www.bilibili.com/video/BV18Z4y1T7yZ/ 【类加载机制】类加载过程:加载+链接+…

    Java 2023年6月7日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球