前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL order by的不同排序规则

MySQL order by的不同排序规则

作者头像
关忆北.
发布2023-10-11 09:35:08
3020
发布2023-10-11 09:35:08
举报
文章被收录于专栏:关忆北.

explain语句执行的结果中,Extra项中含有Using filesort表示需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。

全字段排序

全字段排序在内存中进行,不涉及磁盘IO、不需要回表操作,但数据量受内存大小影响,有局限性。 语句执行流程:

  1. 初始化sort_buffer,将需要查询的字段放入sort_buffer。
  2. 逐行或从索引中找到满足where条件的主键id。
  3. 将主键id索引取出整行,取查询出的字段值放入sort_buffer。
  4. 取下一个满足where条件的主键id。
  5. 重复步骤3、4,直到不满足where条件。
  6. 对sort_buffer中的数据按order by条件快速排序。
  7. 按照排序结果取数据返回。
rowid排序

rowid排序涉及磁盘IO,需要一次回表操作,不受内存大小限制。 当排序的字段较多时,内存可放下的行数很少,需要分成很多个临时文件,排序性能很差,即MySQL认为排序的单行长度太大会使用rowid排序。 语句执行流程:

  1. 初始化sort_buffer,将需要查询的字段放入sort_buffer。
  2. 逐行或从索引中找到满足where条件的主键id。
  3. 到主键id索引中取出整行,将查询的字段数据放入sort_buffer中。
  4. 取出下一个记录的主键id。
  5. 重复步骤3、4直到不满足where条件为止。
  6. 对sort_buffer中的数据按order by的条件进行排序。
  7. 遍历排序结果,取数据返回。

控制用于排序的行数据的长度,单行长度超过该值,MySQL更换排序算法 SET max_length_for_sort_data = 16;

使用索引排序

语句执行流程:

  1. 从索引找到第一个满足where条件的主键id
  2. 到主键id索引取出整行,找出需要返回的字段,作为结果集直接返回
  3. 从索引取下一个记录主键的id
  4. 重复步骤2、3,直到不满足where条件时循环结束。

当索引上的字段信息满足查询的结果集时(即覆盖索引),则不需要再回到主键索引上取数据。步骤2就变成了从索引上取出数据,作为结果集直接返回,节省一步回表操作。

使用覆盖索引时,explain语句的Extra字段会多了个"Using index",表示使用索引覆盖。

MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全字段排序
  • rowid排序
  • 使用索引排序
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档