mysql排序

全字段排序

我们经常使用order by对数据进行排序,它的内部执行过程,为了避免全表扫描,给条件字段设置索引,根据索引知道ID值,通过ID索引找到整行数据,数据放入mysql在内存中准备的sort buffer,根据name字段为这些数据排序,最终只要前1000行的数据。

csharp 复制代码
select city,name,age from t where city='杭州' order by name limit 1000  ;

sort_buffer_size

按照字段排序数据,mysql提供了sort_buffer_size,如果要排序的数据量小于它,就在内存中排序。如果大于,就在外部磁盘临时文件排序。

number_of_tmp_files

临时文件数量,把所有的数据分成好几份,排好序后放入临时文件,有序文件合并成一个大的有序大文件。

rowid排序

如果sort_buffer里面的字段太多,内存放不下,字段会占用多个临时文件,磁盘需要分配更多的临时文件。性能会变差。

max_length_for_sort_data

如果单行数据长度超过我们设定的max_length_for_sort_data值,sort_buffer字段就要减少,只留下排序字段和ID组成sort_buffer。利用排序字段排好序,通过ID获取前1000行数据,抽取我们要的字段组成结果集。

选择哪个合适

我们寄希望于所有的数据都能在内存中完成所有操作,内存越大越好,减少磁盘访问。如果内存特别小,我们只能使用rowid排序算法。

如果我们想取消在临时空间排序数据这一步,我们要保证我们的数据已经提前排好序。为这些字段建立一个索引,使用覆盖索引方式,我们不用再回表查询主键索引获取数据,索引的信息已经满足我们的需求。

相关推荐
程序员塔塔喵38 分钟前
【MySQL篇|第十而二篇】深层次讲解MVCC机制
mysql·mvcc
一技安身1 小时前
MySQL 8.4.13 LTS 通用二进制包(Linux免安装版)完整教程
linux·mysql·adb
代码派1 小时前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移
我不会起名字3221 小时前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
mysql·explain·执行计划·索引下推·成本模型
Decay__8 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
Decay__14 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
后台模板学习21 小时前
MongoDB 与 MySQL 在 IM 即时聊天场景中该
数据库·mysql·mongodb
IT大白鼠1 天前
渗透测试实战从靶场搭建到渗透流程——第 8 篇 · 服务型靶标(上):MySQL 双版本写文件链
数据库·mysql·渗透测试
少年的范儿1 天前
Windows 安装 MySQL 8.4 教程(ZIP 解压版):配置 my.ini、初始化数据库与启动服务
数据库·windows·mysql
神仙别闹1 天前
基于Python+MySQL实现(Web)个人博客系统
python·mysql·php