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排序算法。

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

相关推荐
在未来等你1 小时前
SQL进阶之旅 Day 21:临时表与内存表应用
sql·mysql·postgresql·database·temporary-table·memory-table·sql-optimization
小Tomkk2 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
寒山李白5 小时前
MySQL复杂SQL(多表联查/子查询)详细讲解
sql·mysql·子查询·多表联查
冰橙子id5 小时前
centos7编译安装LNMP架构
mysql·nginx·架构·centos·php
玛奇玛丶5 小时前
面试官:千万级订单表新增字段怎么弄?
后端·mysql
天天摸鱼的java工程师6 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
Clang's Blog6 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
异常君7 小时前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
RestCloud7 小时前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
程序员岳焱8 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql