1.永远小表驱动大表
MySQL 查询优化
    说明:在一般情况下,in里面的数字不超过200,超过太多一般就会出错。

2.order by关键字优化:
(1) ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序。
    MySQL支持二种方式的排序,FileSort和Index,Index效率高.它指MySQL扫描索引本身完成排序。FileSort方式效率较低。
    ORDER BY满足两情况,会使用Index方式排序:① ORDER BY 语句使用索引最左前列;②使用Where子句与Order BY子句条件列组合满足索引最左前列。

(2) 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀。

(3) 如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序
    双路排序:MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据.
    单路排序 : 从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
    由于单路是后出的,总体而言好过双路。但是用单路有问题...
    在sort_buffer中,方法B比方法A要多占用很多空间,因为方法B是把所有字段都取出, 所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取取sort_buffer容量大小,再排……从而多次I/O。

(4) 优化策略
    增大sort_buffer_size参数的设置;
    增大max_length_for_sort_data参数的设置.

(5) 小总结:
MySQL 查询优化


3.GROUP BY关键字优化:
(1) group by实质是先排行分序后进组,遵照索引建的最佳左前缀
(2) 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
(3) where高于having,能写在where限定的条件就不要去having限定了。

相关文章: