join

        mysql中只有一种join算法,就是nested loop join。实际上nlj就是通过驱动表的结果集作为循环基础数据,然后将该结果集中的数据作为过滤条件一条条的到下一个表中查询数据。然后最后合并结果。

        基于上面的描述,优化join语句如下:

1、尽可能减少nlj的循环次数。就是之前说的,一定要让小结果集去驱动大结果集。在join之前的结果集中尽可能多的过滤掉更多的记录。

2、保证join后面的表的相应join字段已经被索引了。因为只有这样才能在每次连接的时候使用索引来优化内部查询。

3、当无法保证被驱动白哦的join条件字段被索引,而且内存足够大的时候,可以尽可能大的设置join buffer。

        order by

        mysql中,orderby有两种实现方式:第一是通过有序索引直接返回有序记录。第二是排序算法排序之后再返回数据。第一种就不用说了,直接返回有序数据。第二种是就是前面文中说过的,1)先取出作为排序条件的字段和“行指针”信息(能定位到某一行,可以理解为主键),然后在sort buffer中进行排序操作。然后利用排好序的数据根据行指针信息返回表中去的客户端请求的其他字段的数据。再返回给客户端。2)一次取出所有的字段进行排序,然后返回给客户端。这样耗内存,但是减少IO。

        当然在使用orderby的时候,希望每次都能直接返回有序结果,而不是经过排序。但是当排序无法避免的时候,就要想办法了。

1、加大max_length_for_sort_data参数。当所有的返回字段的最大长度小于这个字段的时候,mysql就会使用第二种排序方法。反之则会选择第一种消耗内存少的。

2、去掉不必要的返回字段。

3、增大sort_buffer_size.

        group by

        group by与orderby相比,主要是多了分组操作。

        mysql中实现groupby的方式主要有三种:

1)使用松散索引扫描实现(未完待续)