聊聊MySQL是如何处理排序的
本文分享自华为云社区《MySQL怎样处理排序⭐️如何优化需要排序的查询?》,作者:菜菜的后端私房菜。
前言
在MySQL的查询中常常会用到 order by
和 group by
这两个关键字
它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?
当使用的查询语句需要进行排序时有两种处理情况:
- 当前记录本来就是有序的,不需要进行排序
- 当前记录未保持顺序,需要排序
使用索引保证有序
对于第一种情况,常常是使用二级索引中索引列的有序来保证结果集有序,从而不需要进行排序
对于表a,为a2建立二级索引,那么在二级索引上a2就是有序的
CREATE TABLE `a` ( `a1` int(11) NOT NULL AUTO_INCREMENT, `a2` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `a3` varchar(255) DEFAULT NULL, PRIMARY KEY (`a1`), KEY `idx_a2` (`a2`) ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;
select * from a order by a.a2 limit 10
当优化器选择使用a2索引时,a2列的记录本身就是有序的,因此不需要再使用其他开销进行排序
当然,优化器也有可能不使用a2索引(当优化器认为使用a2回表开销太大时会使用全表扫描)
当优化器使用的索引上a2无序时,则会通过其他手段对结果进行排序
filesort
当执行计划的Extra附加信息中出现 Using filesort
时,会使用sort_buffer对结果进行排序
sort_buffer是一块用于排序的内存,sort_buffer可能存放查询需要的所有字段,也可能只存放需要排序的字段和主键
show variables like 'max_length_for_sort_data'
当查询需要的字段长度小于 max_length_for_sort_data
时,则会将查询需要的所有字段放入sort_buffer中,然后对需要排序的列进行排序,最后返回结果
当查询需要的字段长度大于 max_length_for_sort_data
时,只会将需要排序的字段和主键值放入sort_buffer中,等到排序后再去查询聚簇索引获取需要查询的列(相当于又多了一次回表)
在sort_buffer中进行排序时,如果内存足够则会在内存中进行排序,如果内存不够则会使用磁盘的临时文件来辅助排序
开启 optimizer_trace
可以查看是否使用临时文件辅助排序
#开启优化器追踪 SET optimizer_trace='enabled=on'; #sql语句 select * from student order by student_name limit 10000; #查看优化器追踪的信息 SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G;
排序使用的算法是归并算法,先分割成多个小文件排序再进行合并
其中number_of_tmp_files
为使用到的临时文件数量,sort_buffer_size
为sort_buffer大小
因此当使用order by、group by等需要排序的关键字时,最好建立合适的索引
如果数据量小可以在sort buffer中排序,如果数据量太大还需要与磁盘交互
总结
当查询语句需要排序时会分为不用排序和需要排序两种情况
当使用的索引有序时则不用再进行排序,通过索引来保证有序
当使用的索引无序时则会使用sort_buffer进行排序,当查询字段的长度未超过限制时,sort_buffer中每条记录会存储需要查询的列
如果超过限制,则sort_buffer只会存储需要排序的列和主键值,排序后再通过主键值进行回表获取需要查询的列
当数据量太大不够在内存中排序完,会使用磁盘页辅助排序,使用归并算法将排序数据分散在多个页再合并
可以通过追踪优化器 optimizer_trace 分析内容查看辅助页的数量等信息
为需要排序的列建立合适的索引,避免使用磁盘页辅助排序
当无法使用索引时可以调整sort buffer 或 max_length_for_sort_data(谨慎)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
万事通,专精部分领域的多功能 Transformer 智能体
介绍 我们很高兴分享“万事通”(Jack of All Trades,简称 JAT) 项目,该项目旨在朝着通用智能体的方向发展。该项目最初是作为对 Gato (Reed 等,2022 年) 工作的公开复现启动的,Gato 提出训练一种能够执行视觉与语言以及决策任务的 Transformer。于是我们首先构建了 Gato 数据集的开放版本。随后,我们在此基础上训练了多模态 Transformer 模型,并针对处理顺序数据和连续值引入了若干改进。 Gato https://hf.co/papers/2205.06175 总体而言,该项目取得了以下成果: 发布了大量在各种任务上表现优异的 专家 RL 智能体。 发布了 JAT 数据集,这是第一个用于通用智能体训练的数据集。它包含了由专家智能体收集的数十万条专家轨迹。 发布了 JAT 模型,这是一种基于 Transformer 的智能体,能够玩电子游戏、控制机器人执行各种任务、理解并在简单的导航环境中执行命令等! 数据集和专家策略 专家策略 传统的强化学习 (RL) 涉及在单一环境中训练策略。利用这些专家策略是构建多功能智能体的有效方法。我们选...
- 下一篇
对话 Databend Labs 联合创始人王吟:大模型浪潮里,云数仓是宠儿 | 极新企服直播实录
以下文章来源于极新,作者王吟 据 IDC 预测,随着企业数字化转型,到 2026 年,中国大数据 IT 支出将达到 360 亿美元。Gartner 预测,得益于托管云服务的推动,到 2023 年,全球数据库市场有望达到 1000 亿美元。这给数仓带来的巨大的市场机会。 中国的云原生数据仓库市场的发展存在一个很关键的有利因素,就是中国庞大的数据体量及潜在的数据分析需求,相比欧美更加旺盛,阿里云、华为云、腾讯云等正在布局该市场。 按照技术的火热程度排名,云原生数仓下一步的发展方向是与大模型进行结合。二者结合后能够极大提升数据分析和挖掘的能力。大模型具备强大的学习和理解能力,可以深入解析数仓中的海量数据,发现隐藏在数据背后的潜在规律和趋势,为企业决策提供更精准的依据,企业能够更快速地获取有价值的信息,及时调整业务策略,提高运营效率和竞争力。 那么,云数仓要如何与大模型结合?其中的创新点是什么?激烈的市场竞争下,如何破圈? 上周,Databend Labs 联合创始人王吟,作客极新直播间,与垂直于产业 AI 的创投和行业研究媒体极新创始人 姜稳围绕“云数仓+AI,用数据引领未来”主题进行对话,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路