环境准备

CREATE TABLE `emp` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`age` int(3) NOT NULL,`salary` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;insert into `emp` (`id`, `name`, `age`, `salary`) values('1','Tom','25','2300');
insert into `emp` (`id`, `name`, `age`, `salary`) values('2','Jerry','30','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('3','Luci','25','2800');
insert into `emp` (`id`, `name`, `age`, `salary`) values('4','Jay','36','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('5','Tom2','21','2200');
insert into `emp` (`id`, `name`, `age`, `salary`) values('6','Jerry2','31','3300');
insert into `emp` (`id`, `name`, `age`, `salary`) values('7','Luci2','26','2700');
insert into `emp` (`id`, `name`, `age`, `salary`) values('8','Jay2','33','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('9','Tom3','23','2400');
insert into `emp` (`id`, `name`, `age`, `salary`) values('10','Jerry3','32','3100');
insert into `emp` (`id`, `name`, `age`, `salary`) values('11','Luci3','26','2900');
insert into `emp` (`id`, `name`, `age`, `salary`) values('12','Jay3','37','4500');create index idx_emp_age_salary on emp(age,salary);

两种排序方式

1). 第一种是通过对返回数据进行排序,也就是通常说的 filesort 排序,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。

2). 第二种通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。

 多字段排序

了解了MySQL的排序方式,优化目标就清晰了:尽量减少额外的排序,通过索引直接返回有序数据。where 条件和Order by 使用相同的索引,并且Order By 的顺序和索引顺序相同, 并且Order by 的字段都是升序,或者都是降序。否则肯定需要额外的操作,这样就会出现FileSort。

Filesort 的优化

通过创建合适的索引,能够减少 Filesort 的出现,但是在某些情况下,条件限制不能让Filesort消失,那就需要加快 Filesort的排序操作。对于Filesort , MySQL 有两种排序算法:

1) 两次扫描算法 :MySQL4.1 之前,使用该方式排序。首先根据条件取出排序字段和行指针信息,然后在排序区 sort buffer 中排序,如果sort buffer不够,则在临时表 temporary table 中存储排序结果。完成排序之后,再根据行指针回表读取记录,该操作可能会导致大量随机I/O操作。

2)一次扫描算法:一次性取出满足条件的所有字段,然后在排序区 sort buffer 中排序后直接输出结果集。排序时内存开销较大,但是排序效率比两次扫描算法要高。

MySQL 通过比较系统变量 max_length_for_sort_data 的大小和Query语句取出的字段总大小, 来判定是否那种排序算法,如果max_length_for_sort_data 更大,那么使用第二种优化之后的算法;否则使用第一种。

可以适当提高 sort_buffer_size 和 max_length_for_sort_data 系统变量,来增大排序区的大小,提高排序的效率。

MySQL高级 orderby 优化相关推荐

  1. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)

    Linux + JVM + Mysql高级性能优化课程 课程名称:      Linux + JVM + Mysql高级性能优化 QQ群:      243242580(小白.菜鸟勿进)跟Java.M ...

  2. Mysql高级-应用优化,查询缓存优化,锁

    文章目录 1. 应用优化 1.1 使用连接池 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL复制分流查询 ...

  3. MySQL高级性能优化

    MySQL高级 如果你是一名开发者,数据库将伴随你的整个职业生涯.掌握SQL写出高效易用的SQL已成为开发者的必备技能.因为整个应用系统离不开数据库,应用系统是否流畅(数据量达到一定程度时),很大一部 ...

  4. MySQL高级-索引优化(超详细)

    性能分析 MySQL Query Optimizer Mysql中由专门负责优化SELECT语句的优化器,主要功能就是通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计 ...

  5. MySQL高级-SQL优化步骤

    优化SQL步骤(explain等) 1 查看SQL执行频率 2 定位低效率执行SQL 3 explain分析执行计划 3.1 环境准备 3.2 explain 之 id 3.3 explain 之 s ...

  6. Mysql高级 索引优化

    Mysql逻辑架构 Mysql与其他数据库相比有点与众不同,他的架构可以在多种不同的场景中应用并发挥作用,主要体现在存储引擎的架构上,插件式的存储引擎结构将查询处理和其他的系统任务以及数据的存储提取分 ...

  7. MySQL高级---索引优化分析(Explain性能分析 二)

    7.key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度.key_len字段能够帮你检查是否充分的利用上了索引.ken_len越长,说明索引使用的越充分. 如何计算: ①先看索 ...

  8. MySQL高级 - 内存优化 - MyISAM内存优化

    MyISAM 内存优化 myisam存储引擎使用 key_buffer 缓存索引块,加速myisam索引的读写速度.对于myisam表的数据块,mysql没有特别的缓存机制,完全依赖于操作系统的IO缓 ...

  9. MySQL高级 - 内存优化 - 优化原则

    内存优化原则 1) 将尽量多的内存分配给MySQL做缓存,但要给操作系统和其他程序预留足够内存. 2) MyISAM 存储引擎的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就 ...

最新文章

  1. 使用babel编译es6
  2. 修改记录功能--jsp,servlet
  3. mysql一列数据转为一行_MySQL高性能优化规范建议,速度收藏
  4. SpringBoot配置swagger2(亲测有效,如果没有配置成功,欢迎在下方留言)
  5. 将mnist获得的数据还原成图片形式
  6. auto.js停止所有线程_使用多线程处理输入的数据
  7. Mysql Order By 字符串排序,mysql 字符串order by
  8. 绘制自己组合的k线图_史上最全K线图大全:搞懂70种K线组合形态,轻松低买高卖不踏空...
  9. mscaffe 训练minist数据
  10. turbo c 2.0 官方下载_iMyFone MintPDF英文版官方下载2.0.10
  11. 实战!Servlet简单实践,完成上次的任务
  12. 大一c语言常见编程题,大一c语言考试复习题
  13. 开发者拒绝写技术博客的常见理由
  14. Springboot项目中图片云存储实现思路
  15. nii、npz、npy、dcm、mhd 的数据互转处理,及多目标分割处理汇总
  16. html 跑步比赛小游戏,跑步比赛小班游戏教案
  17. linux attach 指令,Docker attach 命令
  18. html怎么调整成苹方,CSS 苹方字体
  19. 基于SpringBoot + Vue的个人博客系统16——文章的修改和删除
  20. linux dmesg查看时间,查看dmesg中的时间

热门文章

  1. Java与C++进行系统间交互:Protocol Buffer
  2. android MotionEvent中getX()和getRawX()的区别
  3. [转]一个简单的反射拷贝一份新的实体类
  4. UOJ #584. 天天去哪吃
  5. Redis|Sentinel 高可用架构
  6. 创建yum存储库;文件目录下存RPM包,不挂载镜像,不使用外网yum源;
  7. 【转载】C#中List集合使用Contains方法判断是否包含某个对象
  8. 前端学习(一) html介绍和head标签
  9. dagride实现模糊查询
  10. 自动刷新获取wifi信号强度,android