本文介绍OrderBy工作原理,参考极客时间-林晓斌老师的MySQL实战45讲。本文需要先掌握B+Tree,覆盖索引知识点。

https://time.geekbang.org/column/article/73479

概述

当分析器发现语句中存在order by关键字,会给当前线程分配一块内存用于排序,称为 sort_buffer(当内存不够用则会使用磁盘)。优化器会根据max_length_for_sort_data参数执行两种排序方案:一种是全字段排序,另一种是Row ID排序。接下来以select a, b, c from table where a=‘value’ order by b;为例。

全字段排序,分为以下三种情况:

  1. 无索引:全表扫描,取出符合条件的记录的a,b,c字段放入sort_buffer,在sort_buffer中按b进行升序,然后返回结果。
    OrderBy工作原理

  2. 走索引:(针对字段a创建索引)通过索引找到符合条件的记录的主键,再通过主键查找a,b,c字段放入sort_buffer,在sort_buffer中按b进行升序,然后返回结果。
    OrderBy工作原理

  3. 覆盖索引:(针对字段a,b,c创建组合索引)通过索引直接查找取出符合条件的记录,因为是覆盖索引,所以不需要回表查询,直接将a,b,c放入sort_buffer,再者索引默认是排序的,所以可以直接返回。
    OrderBy工作原理

rowid排序:当要查询的字段过大,超过max_length_for_sort_data,优化器会使用rowid来进行排序,先查出符合条件的记录,将字段b和主键加入sort_buffer,进行排序,按顺序通过主键查询a,b,c,组装后返回。
OrderBy工作原理

详情

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
  • 2021-12-09
  • 2021-11-17
  • 2021-11-30
  • 2021-11-30
  • 2021-11-20
猜你喜欢
  • 2021-07-01
  • 2021-08-14
  • 2021-05-25
  • 2022-01-06
  • 2021-09-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案