- SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
5 rder by 和 group by 字段列不一致
- SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2 group by key_part4;
6. 索引本身是无序存储的,比如 hash 索引,不克不及应用索引的有序性。
7. order by 字段只被索引了前缀 ,key idx_col(col(10))
- select * from t1 order by col ;
8. 对于还有 join 的接洽关系萌芽,排序字段并非全部来自于第一个表,应用 explain 查看履行筹划第一个表 type 值不是 const 。
当无法避免排序操作时, 又该若何来竽暌古化呢?很显然, 优先选择 using index 的排序方法,在无法知足应用索引排序的情况下,尽可能让 MySQL 选择应用第二种单路算法来进行排序。如许可以削减大年夜量的随机 IO 操作, 很大年夜幅度地进步排序的效力。
1. 加大年夜 max_length_for_sort_data 参数的设置
2. 去掉落不须要的返回字段
当内存不是很充裕时, 不克不及简单地经由过程强行加大年夜膳绫擎的参数来强迫 MySQL 去应用改进版的排序算法, 不然可能会造成 MySQL 不得不将数据分成很多段, 然落后行排序, 如许可能会得不偿掉。此时就须要去掉落不须要的返回字段, 让返回结不雅长度适应 max_length_for_sort_data 参数的限制。
同时也要规范 MySQL 开辟规范,尽量避免大年夜字段。当有 select 萌芽列含有大年夜字段 blob 或者 text 的时刻, MySQL 会选择惯例排序。
" algorithm to use. It normally uses the modified algorithm except when or columns are involved, in which case it uses the original algorithm."
3. 增大年夜 sort_buffer_size 参数设置
这个值如不雅过小的话, 再加上你一次返回的条数过多, 那么很可能就会分很多次进行排序, 然后最后将每次的排序结不雅再串联起来, 如许就会更慢, 增大年夜 sort_buffer_size 并不是为了让 MySQL 选择改进版的排序算法, 而是为了让 MySQL 尽量削减在排序过程中对须要排序的数据进行分段, 因为分段会造成 MySQL 不得不应用临时表来进行交换排序。然则这个值不是越大年夜越好:
1. sort_buffer_size 是一个 connection 级参数, 在每个 connection 第一次须要应用这个 buffer 的时刻, 一次性分派设置的内存。
2. 排序字段在不合的索引中,无法应用索引排序
2. sort_buffer_size 并不是越大年夜越好, 因为是 connection 级的参数, 过大年夜的设置 + 高并发可能会耗尽体系内存资本。
3. 据说 sort_buffer_size 跨越 2M 的时刻, 就会应用 mmap() 而不是 malloc() 来进行内存分派, 导致效力降低。
四 参考文┞仿
[1] MySQL order by 调优官方文档
[2] MySQL 排序道理与案例分析
【编辑推荐】
- 应用数据库SA暗码登录修改体系治理员暗码
- 硬件是若何影响数据库的成长
- 对MySQL数据库复制中断的处理
- MySQL Schema与数据类型的优化
- 数据库安然的5个根本实践
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 简介:比来在重构app,原app用的是xcode自带的启动图设置。但相对来说自定义启动图可扩大性更强一点,今天花>>>详细阅读
本文标题:MySQL order by原理以及优化?这篇来给你逐步解析
地址:http://www.17bianji.com/lsqh/38202.html
1/2 1