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优化的更多相关文章

  1. 一次 group by + order by 性能优化分析

    一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...

  2. 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化

    问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...

  3. 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 ...

  4. Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议

    Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议 索引 索引是一种存储引擎快速查询记录的一种数据结构. 注意 MYSQL一次查询只能使用一个索引 ...

  5. MySql学习(二) —— where / having / group by / order by / limit 简单查询

    注:该MySql系列博客仅为个人学习笔记. 这篇博客主要记录sql的五种子句查询语法! 一个重要的概念:将字段当做变量看,无论是条件,还是函数,或者查出来的字段. select五种子句 where 条 ...

  6. mysql order by rand() 优化方法

    mysql order by rand() 优化方法 适用于领取奖品等项目<pre>mysql> select * from user order by rand() limit 1 ...

  7. MySQL 第七天(核心优化一)

    一.Mysql核心优化 1. 优化的方面 ① 存储层:数据表"存储引擎"选取.字段选取.逆范式(3范式) ② 设计层:索引.分区/分表 ③ 架构层:分布式部署(主从模式/共享) ④ ...

  8. Mysql占用CPU过高如何优化,如何解决

    2017-02-28 15:13 331人阅读 评论(0) 收藏 举报   MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...

  9. MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

    第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...

随机推荐

  1. css 块状元素与行内元素(内联元素)的理解

    块状元素: 它一般是其他元素的容器元素,可以容纳块状元素和行内元素,它默认是不会和其他元素同一行的,即相当于两个块状元素写一起是垂直布局的.最常用的是div和p 行内元素: 行内元素又称内联元素,它只 ...

  2. 日历插件——laydate.js

    laydate是一款很好用的日历控件,兼容了包括IE6在内的所有主流浏览器,默认有三种皮肤,如需其它皮肤可去官网下载http://www.layui.com/laydate/  一.核心方法:layd ...

  3. shell第四篇(上)

    第四篇了解Shell 命令执行流程图 {网中人大哥推荐参考Learning the Bash Shell, 2nd Edition,第 178页:中文版229页} Shell 从标准输入或脚本中读取的 ...

  4. 完全卸载SQL Server 2008r2

    完全卸载SQL Server 2008r2   "五一"时进行了系统重装,在没有卸载SQL Server 2008情况下尝试安装SQL Server 2008r2 ,安装提示成功但 ...

  5. java基础(六) switch语句的深入解析

    引言   switch 语句是非常的基础的知识,掌握起来也不难掌握,语法比较简单.但大部分人基本是知其然,不知其所以然.譬如 早期JDK只允许switch的表达式的值 int及int类型以下的基本类型 ...

  6. C#基础(二)--之数据类型

    在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...

  7. SQL作业二

    目的:通过加载chinook_db文件来把数据导入到sqllite,根据题目的要求进行查询 1.sql语句的基本语法 2.join多表查询的用法 3.group by分组的用法 4.order by排 ...

  8. Core Animation 文档翻译 (第七篇)——改变Layer的默认动画

    前言 核心动画使用action对象实现它的可视化动画.一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象.所有的CAAnimation对象实现了这个协议,无论何时L ...

  9. DAY11-Java中的类--接上篇

    一.用户自定义类 1.写先出一个简单的Employee类作为例子说明. 代码如下: import java.time.LocalDate; /** * 自定义方法练习--测试 这个程序中包含了两个类E ...

  10. androidstudio canary5一个bug

    Android Studio最新开发版一直跟着升级.到Canary5的时候出了一个bug. app build.gradle添加自己编译的aar库,原本一直使用: compile(name:'ijkp ...