Mysql group by,order by,dinstict优化
1.order by优化
2.group by优化
3.Dinstinct 优化
1.order by优化
实现方式:
1. 根据索引字段排序,利用索引取出的数据已经是排好序的,直接返回给客户端;
2. 没有用到索引,将取出的数据进行一次排序操作后返回给客户端。
EXPLAIN SELECT m.id,m.subject,c.content FROM group_message m,group_message_content c WHERE m.group_id = 1 AND m.id = c.group_msg_id ORDER BY m.user_id\G;
optimizer对query进行了优化,它会按照m.user_id上的索引顺序来访问数据,这样获取的数据已经是排好序的。
这种利用索引实现数据排序的方法是 MySQL 中实现结果集排序的最佳做法,利用已有的索引避免实际的排序计算所带来的资源消耗。
如果没有用到索引,mysql就会将取出的数据按照一定的排序算法进行排序,然后再把排好序的数据返回给客户端。mysql中主要使用两种排序算法:
1. 取出用于排序的条件字段和指向相应数据行的指针,在sort buffer中对条件进行排序,排好序之后利用指针取出数据行中的请求数据,然后返回给客户端;
2. 取出用于排序的条件字段和其它所有请求数据,将不用于排序的字段存放在一块内存中,然后在sort buffer中对条件字段进行排序,排好序后利用行指针将在内存中的数据进行匹配合并结果集,然后将排好序的数据返回给客户端。(减少数据的二次访问,节省了IO操作)
3.当用于排序的字段存在在多个表中,或者在排序之前要先经过join操作,mysql必须先把join的结果集放入一个临时表,之后再把临时表中的数据取到sort buffer里进行排序。
优化方式:
1. 加大max_length_for_sort_data参数的设置。当需要取出的所有数据长度小于这个参数的值的时候,mysql将采用第二重排序算法,否则,使用第一种算法,所以只要内存充足就可以设置足够大的值来让mysql采用改进的排序算法。
2. 去掉不必要的字段。
3. 增大sort_buffer_size参数的值。当mysql对条件字段进行排序时,如果需要排序字段的总长度大于该参数的值的时候,mysql就会对需要排序的字段使用临时表进行分段,这样也会有性能的消耗。
2.group by优化
group by的实现过程除了要使用排序操作外,还要进行分组操作,如果使用到一些聚合函数,还要进行相应的聚合计算。
实现方式:
1. 使用松散(Loose)索引扫描实现group by,所谓的松散索引扫描,就是mysql不需要扫描所有满足条件的索引键即可完成group by操作
2. 使用紧凑(Tight)索引扫描实现group by,紧凑索引与松散索引最主要的区别就是在需要扫描索引的时候,紧凑索引读取所有满足条件的索引键,然后再来使用group by操作得到相应的结果。
3.当optimizer无法找到合适的索引可以利用的时候,就会选择将读取的数据放入临时表中来完成group by操作。group by操作想要利用索引,必须满足group by字段必须同时存放于同一个索引中,且该索引是一个有序索引,而且,使用不同的聚合函数也会影响是否使用索引来实现group by操作。
优化方式:
1. 尽可能利用索引并且是松散索引来完成group by操作,这的依靠调整索引或者调整query来实现;
2. 当无法利用索引的时候,必须要提供足够的sort_buffer_size来供mysql完成排序操作,之前介绍过,不然mysql会将需要排序的字段进行分段排序,会影响性能。除此之外尽量不要对大结果集进行group by操作,因为一旦数据量超过系统最大临时表大小时,mysql会将临时表里的数据copy到磁盘上然后再进行操作,性能会成数量级的下降。
3.Dinstinct 优化
实现方式:
distinct的实现原理同group by类似,实现过程只是在group by之后只取出每一组中的第一条记录,所以distinct同样可以利用松散或者紧凑索引来实现,不同的是,当无法利用索引实现distinct时,mysql同样会将数据取出放进一个临时表,不过不会对临时表进行排序操作。
优化方式:
尽量使用索引,无法使用索引的时候,确保不要在大结果集上进行distinct操作,磁盘上的IO操作和内存中的IO操作性能完全不是一个数量级的差距。
Mysql group by,order by,dinstict优化的更多相关文章
- 一次 group by + order by 性能优化分析
一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...
- 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化
问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...
- mysql group by order by havaing where 顺序
结论: select xx from xx where xx group by xx order by xxx; select xx from xx group by xx having xx ord ...
- Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议
Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议 索引 索引是一种存储引擎快速查询记录的一种数据结构. 注意 MYSQL一次查询只能使用一个索引 ...
- MySql学习(二) —— where / having / group by / order by / limit 简单查询
注:该MySql系列博客仅为个人学习笔记. 这篇博客主要记录sql的五种子句查询语法! 一个重要的概念:将字段当做变量看,无论是条件,还是函数,或者查出来的字段. select五种子句 where 条 ...
- mysql order by rand() 优化方法
mysql order by rand() 优化方法 适用于领取奖品等项目<pre>mysql> select * from user order by rand() limit 1 ...
- MySQL 第七天(核心优化一)
一.Mysql核心优化 1. 优化的方面 ① 存储层:数据表"存储引擎"选取.字段选取.逆范式(3范式) ② 设计层:索引.分区/分表 ③ 架构层:分布式部署(主从模式/共享) ④ ...
- Mysql占用CPU过高如何优化,如何解决
2017-02-28 15:13 331人阅读 评论(0) 收藏 举报 MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
随机推荐
- 【转载】Linux时间相关结构与函数
1 时间的获取 在程序当中, 我们经常要输出系统当前的时间,比如日志文件中的每一个事件都要记录其产生时间.在 C 语言中获取当前时间的方法有以下几种,它们所获得的时间精度从秒级到纳秒,各有所不同. 表 ...
- [HTTP] PHP 实现 HTTP Server 原理
单进程服务器简陋版: <?php /** * Single http server. * * Access http://127.0.0.1:8081 * * @license Apache-2 ...
- gulp压缩文件最简示例
安装gulp-uglify 作为项目的开发依赖即可 $ npm gulp-uglify --save-dev 压缩js文件 gulpfile.js const gulp = require('gulp ...
- JAVA设计模式---迭代器模式
1.定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 2.实例:1)需求: 菜单(煎饼屋菜单.餐厅菜单和咖啡菜单)采用不同的集合存取(ArrayList,String[] ...
- Kafka Consumer
Push VS Pull An initial question we considered is whether consumers should pull data from brokers or ...
- tomcat集群与负载均衡
参考文章http://kalogen.iteye.com/blog/784908,加上了自己调试过程中遇到的问题. 注1:实现此集群的方法参考了网上的很多文章,但由于很多文章都表明是原创的,故无法知道 ...
- Python基础篇(七)
加上两个下划线变量或者方法变为私有. >>> class Bird: ... __song = "spark" ... def sing(self): ...
- Retrofit 实践
Retrofit是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJ ...
- 将html table 转成 excel
package com.sun.office.excel; /** * 跨行元素元数据 * */ public class CrossRangeCellMeta { public CrossRange ...
- Windows实用快捷键
1 返回上一级目录:Backspace 2 复制当前窗口:Ctr + N 3 在当前文件目录中选定首个文件(夹):Space 4 切换窗口:Alt + Tab 5 当前浏览器Tab页倒退或前进历史页 ...