mysql 分组自定义排序(正排倒排,并不是 MySQL 的排序的全部!)
mysql 分组自定义排序
正排倒排,并不是 MySQL 的排序的全部!
引言
春节前一个悠闲的上午,小航送了我,一袋坚果,他看我吃的正香,慢慢问道:”温哥,mysql的排序,有什么要注意的吗,不就是正排倒排吗?”
我一听他问我的问题,顿感坚果不香了,但是为了技术(mainzi),我装作大师的说道:
“正排倒排,当然不是全部,你最少要知道,2个参数,1个优化,一种特殊情况”
注:东西不能乱吃啊
两个核心参数
sort_buffer_size 决定内排,外排。内排就是走内存,外排就是采用归并排序走磁盘。
max_length_for_sort_data 决定 全字段排序还是,rowid排序。
全字段排序
字段都放到 sort_buffer 中,排序后就会直接从内存里面返回查询结果了
Rowid排序
内存放rowid与排序字段,排序后,再从库中找数据,拼接返回。
优化手段覆盖索引
覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键索引上去取数据。另外,MySQL 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。
例子
- explain
- SELECT order_id,pay_date FROM orders_detail WHERE order_id='1001' ORDER BY pay_date asc
用到了filesort,也就是需要排序。《MySQL 开发的 36 条军规》推荐看下。
调整索引
- ALTER TABLE `orders_detail` DROP INDEX `order_id`,ADD INDEX `order_id` (`order_id`, `pay_date`);
之后
- explain
- SELECT order_id,pay_date FROM orders_detail WHERE order_id='1001' ORDER BY pay_date asc
没有用到filesort,因为复合索引,字段后是有序的。
特殊情况 Order by+ Limit
Limit可能用到优先队列排序算法。
例子:
1. 开启优化追踪
- SET OPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=off;
- SET optimizer_trace_offset=-30, optimizer_trace_limit=30;
2. 查看字段索引
- SHOW INDEX FROM oc_order_online WHERE COLUMN_NAME='order_name';
结果显示没有索引
3. 执行order by+limit 查询语句
- select * from `oc_order_online` order by `order_name` limit 20
4. 查询优化追踪信息
- SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE limit 30
对应结果如下:
查询将红框中数据,粘贴到json.cn查看格式化数据,有如下片段
filesort_priority_queue_optimization 中的chosen:true表示使用了优先队列排序。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。
总结
- sort_buffer_size 决定内排,外排
- max_length_for_sort_data 决定 全字段排序还是,rowid排序
- 覆盖索引是一种优化手段
- Limit可能涉及优先队列排序
原文链接:https://mp.weixin.qq.com/s/cXDlZstVIQbynHCveMxz4A
- 修改sqlserver数据库所有者
- SQL SERVER中查看一个数据库的表结构及字段
- vue实现图片上传数据库(vue.js根据图片url进行图片下载)
- 云数据库navicat连不上(Navicat Premium15连接云服务器中的数据库问题及遇到坑)
- mysql恢复数据库(MySQL 两种恢复数据的方法)
- sql server2008如何升级到2012(MS sqlserver 2008数据库转换成2000版本的方法)
- zabbix数据库解析(zabbix agent2 监控oracle数据库的方法)
- sqlserver2008数据库的备份(sql server 2008 压缩备份数据库20g)
- 将Excel数据导入数据库
- SQL Server无法连接远程数据库的解决方法
- dedecms数据库优化(dedecms 安全设置终极技巧补充idc)
- mysql插入数据错误代码(教你解决往mysql数据库中存入汉字报错的方法)
- sqlserver备份整表数据的语句(SqlServer批量备份多个数据库且删除3天前的备份)
- sqlserver常用基本数据类型有哪些(浅述SQL Server的语句类别 数据库范式 系统数据库组成)
- deepin数据库编程(deepin20.1系统安装MySQL8.0.23超详细的MySQL8安装教程)
- 数据库最大连接池max pool size
- 你或许不知道你隐藏的支配欲望(你或许不知道你隐藏的支配欲望)
- 把宽体丰田86卖了,换成7.5代高尔夫GTI玩起姿态与性能并存的改装(把宽体丰田86卖了)
- 大众推出了第五代高尔夫GT(大众推出了第五代高尔夫GT)
- 换代在即,现在是抄底 7.5代 高尔夫的最佳时机吗(换代在即现在是抄底)
- 2020年大众7.5代高尔夫R终结特别版 最后的呐喊(2020年大众7.5代高尔夫R终结特别版)
- 七年前的这部剧有毒,全剧只有女主红到发紫,男主至今无人认识(七年前的这部剧有毒)
热门推荐
- MVC中modelstate的使用
- python编写计算机病毒教程(Python告诉你木马程序的键盘记录原理)
- php技术优点和缺点(php的优点总结 php有哪些优点)
- 开启wds点击保存没有反应(WDCP控制面板打开空白或无法登录的解决办法)
- mysql cache(MySQL取消了Query Cache的原因)
- 运营人员应具备的基本技能
- docker配置和启动(Docker的安装与配置命令代码实例)
- mysql高级概念(MySQL 自定义变量的概念及特点)
- dedecms列表栏目使用教程(DedeCMS文章列表每5隔行加横线的实现方法)
- dockervolume迁移工具(Docker中数据卷volume管理的两种方式)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9