MySQL的DISTINCT优化

三、DISTINCT的实现与优化
DISTINCT实际上和GROUP BY的操作非常相似,只不过是在GROUP BY之后的每组中只取出一条记录而已。所以,DISTINCT的实现和GROUP BY的实现也基本差不多,没有太大的区别。

同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成DISTINCT的时候,MySQL只能通过临时表来完成。

但是,和GROUP BY有一点差别的是,DISTINCT并不需要进行排序。也就是说,在仅仅只是DISTINCT操作的Query如果无法仅仅利用索引完成操作的时候,MySQL会利用临时表来做一次数据的“缓存”,但是不会对临时表中的数据进行filesort操作。

1、通过松散索引扫描完成DISTINCT
执行计划中的Extra信息为“Using index for group-by”,这代表什么意思?为什么我没有进行GROUP BY操作的时候,执行计划中会告诉我这里通过索引进行了GROUP BY呢?其实这就是于DISTINCT的实现原理相关的,在实现DISTINCT的过程中,同样也是需要分组的,然后再从每组数据中取出一条返回给客户端。而这里的Extra信息就告诉我们,MySQL利用松散索引扫描就完成了整个操作。

继续阅读MySQL的DISTINCT优化

MySQL的GROUP BY优化

二、GROUP BY的实现与优化
由于GROUP BY实际上也同样需要进行排序操作,而且与ORDER BY相比,GROUP BY主要只是多了排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算。所以,在GROUP BY的实现过程中,与ORDER BY一样也可以利用到索引。

在MySQL中,GROUP BY的实现同样有多种(三种)方式

1、使用松散(Loose)索引扫描实现GROUP BY
何谓松散索引扫描实现GROUP BY呢?实际上就是当MySQL完全利用索引扫描来实现GROUP BY的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果。

在执行计划的Extra信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,MySQL Query Optimizer通过使用松散索引扫描来实现了我们所需要的GROUP BY操作。

要利用到松散索引扫描实现 GROUP BY,需要至少满足以下几个条件:
◆ GROUP BY条件字段必须在同一个索引中最前面的连续位置;
◆ 在使用GROUP BY的同时,只能使用MAX和MIN这两个聚合函数;
◆ 如果引用到了该索引中GROUP BY条件之外的字段条件的时候,必须以常量形式存在;

继续阅读MySQL的GROUP BY优化

MySQL的ORDER BY优化

除了常规的Join语句之外,还有一类Query语句也是使用比较频繁的,那就是ORDER BY,GROUP BY以及DISTINCT这三类查询。考虑到这三类查询都涉及到数据的排序等操作,所以我将他们放在了一起,下面就针对这三类Query语句做基本的分析。

一、ORDER BY的实现与优化

1、在MySQL中,ORDER BY的实现有如下两种类型:
◆ 一种是通过有序索引而直接取得有序的数据,这样不用进行任何排序操作即可得到满足客户端要求的有序数据返回给客户端;
◆ 另外一种则需要通过MySQL的排序算法将存储引擎中返回的数据进行排序然后再将排序后的数据返回给客户端。

2、第一种情况:
这种利用索引实现数据排序的方法是MySQL中实现结果集排序的最佳做法,可以完全避免因为排序计算所带来的资源消耗。所以,在我们优化Query语句中的ORDER BY的时候,尽可能利用已有的索引来避免实际的排序计算,可以很大幅度的提升ORDER BY操作的性能。

继续阅读MySQL的ORDER BY优化