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
- mysql更新数据库表中的数据语法(Mysql联表update数据的示例详解)
- 数据库的乐观锁与悲观锁
- mysql索引面试总结(Mysql数据库索引面试题程序员基础技能)
- 数据库操作题(数据库日常练习题,每天进步一点点2)
- mysql数据库主键选择的详解(图文详解MySQL中的主键与事务)
- mysql显示所有数据库语句(MySQL数据库自动补全命令的三种方法)
- mysql数据库三种模式(MySQL数据库是如何实现XA规范的)
- sqlserver怎么查看数据库版本(Sql Server数据库各版本功能对比)
- dedecms数据库备份(dedecms网站搬家需要的备份的文件)
- 如何让yii2高级模板运行起来(Yii框架数据库查询、增加、删除操作示例)
- thinkphp5.1手动连接mysql数据库(thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例)
- php添加数据到mysql数据库(PHP通过代码连接XAMPP数据库及MySQL数据库方法)
- sqlserver实例全库备份(sql server通过脚本进行数据库压缩全备份的方法推荐)
- laravel 获取数据库操作异常(Laravel Eloquent ORM 多条件查询的例子)
- mysql url连接参数配置(浅谈Mysql连接数据库时host和user的匹配规则)
- sqlserver备份还原数据(通过Windows批处理命令执行SQL Server数据库备份)
- 15个新成 园 位置公布 深圳龙岗2022年共建花园建设又有大动作(15个新成园位置公布)
- 记者手记 书记带我去 巡街(记者手记书记带我去)
- 富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元 | 美通社(富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元)
- 二次创业 的富士胶片,在进博会上首次展示完成转型后的全线医疗产品(二次创业的富士胶片)
- 富士胶片 中国 我们对上海的信心没有任何改变(富士胶片中国)
- 赢麻了 富士公布2021年度财报 营利同比增长240(富士公布2021年度财报)
热门推荐
- idea 远程部署docker(通过idea打包项目到docker的操作方法)
- 织梦列表页调用文章简介不显示(织梦文章系统修改专题文章列表的模板的方法)
- MYSQL中常用的强制性操作
- 怎么知道sqlyog连接的哪个mysql(SQLyog连接MySQL8.0报2058错误的完美解决方法)
- sql的ddl语句(使用sqlplus创建DDL和DML操作方法)
- php怎么判断数据是质数(PHP判断一个变量是否为整数、正整数的方法示例)
- mysql百万数据分页查询优化方案(MySQL单表亿级数据分页怎么优化?)
- mysql索引的弊端(MySQL 全文索引的原理与缺陷)
- 微信小程序js 抽奖概率(小程序实现筛子抽奖)
- vue走马灯特效(Javascript结合Vue实现对任意迷宫图片的自动寻路)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9