首页 技术 正文
技术 2022年11月17日
0 收藏 391 点赞 4,617 浏览 2521 个字

一.MYSQL 中有两种排序方式:1:通过有序索引顺序扫描直接返回有序数据,这种方式在使用explain 分析查询的时候显示为Using Index ,不需要额外的排序,操作效率较高。2: 是通过对返回数据进行排序,也就是通常说的filesort 排序,所有不是通过索引直接返回排序结果都叫filesort排序。filesort 并不代表磁盘文件进行排序,而只是说明了进行一个排序操作,至于排序操作是否使用了磁盘文件或临时表等,则取决于mysql 服务器对排序参数的设置和需要排序数据的大小。例如,按照商店store_id 排序返回所有客户记录时,出现了对全表扫描的结果排序:explain select * from customer order by store_idExtra : Using filesort 又如,只需要获取商店store_id 和顾客email 信息时,对表customer 的扫描就被覆盖索引idx_storeid_email 扫描替代,此时虽然只访问了索引就足够,但是在索引idx_stored_email 上发生了一次排序操作,所以执行计划仍然有 using filesort.alter table customer add index idx_storeid_email(store_id,email); explain select store_id ,email ,customer_id from customer order by emailextra :Using Index ,Using filesort  Filesort 是通过相应的排序算法,将取得的数据在sort_buffer_size 系统变量设置的内存排序区中进行排序,如果内存装载不下,它就会将磁盘上的数据进行分区,再对各个数据块进行排序,然后将各个块合并成有序的结果集。sort_buffer_size 设置的排序区是每个线程独占的,所以同一个时刻,mysql 中存在多个sort buffer 排序区. 了解了mysql 排序的方式,优化目标就清晰了:尽量减少额外的排序,通过索引直接返回有序数据。where 条件和order by 使用相同的索引,并且order by 的顺序和索引顺序相同,并且order by 的字段都是生序或者都是降序,否则肯定需要额外的排序操作,这样就会出现filesort.总结,下列SQL 可以使用索引:select * from tabname order by key_part1,key_part2,……;select * from tabname where key_part1 order by key_part1 desc ,key_part2 desc;select * from tabname order by key_part1,key_part2 desc; 但是在以下几种情况下则不使用 索引: select * from tabname order by key_part1 desc ,key_part2 asc;– order by 的字段混合ASC 和 DESCselect * from tabname where key2=constant order by key1;– 用于查询行的关键字与order by 中所使用的不相同select * from tabname order by key1,key2;– 对不同的关键字使用order by :  二.Filesort 的优化通过创建合适的索引能够减少filesort 出现,但是在某些情况下,条件限制不能让filesort 消失,那就需要想办法加快 filesort 的操作。对于filesort ,MYSQL 有两种排序算法。1.两次扫描算法(Two passes):首先根据条件取出排序字段和行指针信息,之后在排序区sort buffert 中排序。如果排序区sort buffer 不够,则在临时表temporary table 中存储排序结果。完成排序后根据行指针回表读取记录。该算法是mysql 4.1 之前采用的算法,需要两次访问数据,第一次获取排序字段和行指针信息,第二次根据行指针获取记录,尤其是第二次读取操作可能导致大量随机 I/O 操作;优点是排序的时候内存呢开销哦较少。 2. 一次扫描算法(Single pass):一次行取出满足条件的行的所有字段,然后在排序区sort buffer 中排序后直接输出结果集。排序的时候内存开销比较大,但是排序效率比两次扫描算法要高。 MySQL 通过比较系统变量 max_length_for_sort_data 的大小和Query 语句取出的字段总大小来判断使用哪种 排序算法。如果 max_length_for_sort_data更大,那么使用第二种优化之后的算法;否则使用第一种算法。适当加大系统变量max_length_for_sort_data 的值,能够让 mysql 选择更优化的filesort 排序算法。当然,假如 max_length_for_sort_data 设置过大,会造成cpu 利用率过低和磁盘I/ O过高,cpu 和I/O利用平衡就足够了。  适当加大sort_buffer_size 排序区,尽量让排序在内存中完成,而不是通过创建临时表放在文件中进行;当然也不能无限制加大 sort_buffer_size 排序区,因为sort_buffer_size 参数是每个线程独占的,设置过大,会导致服务器SWAP 严重,要考虑数据库活动连接数和服务器内存的大小来适当设置排序区。尽量使使用必要的字段,select 具体的字段名称,而不是 select * 选择 所有字段,这样可以减少排序区的使用,提高SQL 性能。 三. 优化 Group BY 语句如果查询包含Group by 但用户想要 避免排序结果的消耗,则可以指定order by null 禁止排序。explain select payment_date,sum(amount) from payment group by payment_fateextra : Using temporary;Using filesort explain select payment_date,sum(amount) from payment_date order by nullextra : Using temporary      

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,075
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,551
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,399
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,811
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,893