order by关键字优化

1. ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序

建表SQL

CREATE TABLE tblA(#id int primary key not null auto_increment,age INT,birth TIMESTAMP NOT NULL
);INSERT INTO tblA(age,birth) VALUES(22,NOW());
INSERT INTO tblA(age,birth) VALUES(23,NOW());
INSERT INTO tblA(age,birth) VALUES(24,NOW());CREATE INDEX idx_A_ageBirth ON tblA(age,birth);SELECT * FROM tblA; 

Case

MySQL支持二种方式的排序,FileSort和Index,Index效率高.
它指MySQL扫描索引本身完成排序。FileSort方式效率较低。

ORDER BY满足两情况,会使用Index方式排序:

ORDER BY 语句使用索引最左前列

使用Where子句与Order BY子句条件列组合满足索引最左前列

2. 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀

3. 如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序

双路排序

MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,
读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出

从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。

取一批数据,要对磁盘进行了两次扫描,众所周知,I\O是很耗时的,所以在mysql4.1之后,出现了第二种改进的算法,就是单路排序。

单路排序

从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了

结论及引申出的问题

由于单路是后出的,总体而言好过双路

但是用单路有问题

在sort_buffer中,方法B比方法A要多占用很多空间,因为方法B是把所有字段都取出, 所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取取sort_buffer容量大小,再排……从而多次I/O。

本来想省一次I/O操作,反而导致了大量的I/O操作,反而得不偿失。

优化策略

增大max_length_for_sort_data参数的设置

增大sort_buffer_size参数的设置

Why

提高Order By的速度
 
1. Order by时select * 是一个大忌只Query需要的字段, 这点非常重要。在这里的影响是:
  1.1 当Query的字段大小总和小于max_length_for_sort_data 而且排序字段不是 TEXT|BLOB 类型时,会用改进后的算法——单路排序, 否则用老算法——多路排序。
  1.2 两种算法的数据都有可能超出sort_buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是用单路排序算法的风险会更大一些,所以要提高sort_buffer_size。
 
2. 尝试提高 sort_buffer_size
不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的
 
3. 尝试提高 max_length_for_sort_data
提高这个参数, 会增加用改进算法的概率。但是如果设的太高,数据总容量超出sort_buffer_size的概率就增大,明显症状是高的磁盘I/O活动和低的处理器使用率.

为排序使用索引OrderBy优化相关推荐

  1. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析

    今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化. 建表 //建表 CREATETABLEIFNOTEXISTSstaffs( idINTPRIMARYKEYAUTO_INCREMENT, ...

  2. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

    mongodb索引详解(Indexes) 索引介绍 索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录.这样扫描集合效率并不高,因为它需要mongod进 ...

  3. MySQL索引性能优化

    01.MySQL:性能优化方案 在应用开发的过程中,由于前期数据量少,开发人员编写的SQL语句或者数据库整体解决方案都更重视在功能上的实现,但是当应用系统正式上线后,随着生成数据量的急剧增长,很多SQ ...

  4. MYSQL通过索引进行优化

    MYSQL通过索引进行优化 一:什么是索引: 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的 ...

  5. MySQL 索引与优化

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表又10^6条记录,DBMS页面的大小为4K,并且存储100条记录.如果没有索引,查询 ...

  6. mysql索引与优化

    2019独角兽企业重金招聘Python工程师标准>>> 第二章.索引与优化 1.选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响.通常来说 ...

  7. lucene索引文件大小优化小结

    lucene索引文件大小优化小结 1 数值数据类型索引优化 1.1 数值类型索引问题 lucene本质上是一个全文检索引擎而非传统的数据库系统,它基于倒排索引,非常适合处理文本,而处理数值类型却不是强 ...

  8. mysql如何建立索引workbench_如何对MySQL索引进行优化分析

    为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引, ...

  9. mysql范围条件_MySQL 索引及优化实战(一)

    mysql 随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能.高并发和高可用的系统. ...

最新文章

  1. python 基础知识点整理 和详细应用
  2. 每日一皮:小公司搞中台的真实写照..
  3. yolov5组件笔记
  4. 【Python数据挖掘课程】九.回归模型LinearRegression简单分析氧化物数据
  5. YII CRUD 例子
  6. 调用PDF的打印命令
  7. linux war版本管理,linux(centos8):用systemctl管理war包形式的jenkins(java 14 / jenkins 2.257)...
  8. go语言查询某个值是否在数组中_go语言中的数组
  9. @MapperScan扫描包的问题
  10. GTK实现绘图功能(draw.c)
  11. STL::算法::常见算法
  12. 智慧城市java开发_智慧城市主界面开发 使用eclipse开发智慧城市APP源码 - 下载 - 搜珍网...
  13. The method isEmpty() is undefined for the type String/String类型的isEmpty报错
  14. otn与stn网络_光通信网络
  15. 扇贝离线 android,扇贝单词离线
  16. ENVI 遥感图像监督分类概述
  17. 变点理论CUSUM在择时交易中的应用
  18. 字节跳动AI lab计算机视觉实习生面试教训
  19. python微信图标制作_Python 一键制作微信好友图片墙的方法
  20. 计算机考研数学复试时间,数学专业考研准备多久

热门文章

  1. 01: MySql简介
  2. Tornado web 框架
  3. linux下ifconfig只剩下lo的解决方法
  4. 【转】Java 枚举7常见种用法
  5. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
  6. ASP.NET 配置文件 configSource 的用法
  7. MY MOBILER v1.23 - 类似SOTI Pocket Controller的免费工具
  8. 全面详细的jQuery常见开发技巧手册
  9. 容器资源需求、资源限制(二十二)
  10. 01python入门一