Join 语句的优化
尽可能减少 Join 语句中 Nested Loop 的循环总次数
最有效的办法是让驱动表的结果集尽可能地小,"永远用小结果集驱动大结果集".
比如, 当两个表 (表 A 和表 B)Join 时, 如果表 A 通过 WHERE 条件过滤后有 10 条记录, 而表 B 有 20 条记录. 如果选择表 A 作为驱动表, 也就是被驱动表的结果集为 20, 那么我们通过 Join 条件对被驱动表(表 B) 的比较过滤就会进行 10 次. 反之, 如果选择表 B 作为驱动表, 则须要进行 20 次对表 A 的比较过滤.
优先优化 Nested Loop 的内层循环
不仅在数据库的 Join 中应该这样做, 实际上在优化程序语言时也有类似的优化原则. 内层循环是循环中执行次数最多的, 每次循环节约很少的资源, 就能在整个循环中节约很多的资源
保证 Join 语句中被驱动表的 Join 条件字段已经被索引
其目的正是基于上面两点的考虑, 只有让被驱动表的 Join 条件字段被索引了, 才能保证循环中每次查询都能够消耗较少的资源, 这也正是内层循环的实际优化方法
不要太吝惜 Join Buffer 的设置
当无法保证被驱动表的 Join 条件字段被索引且内存资源充足时, 不要太吝惜 Join Buffer 的设置. 在 Join 是 All,Index,range 或 index_merge 类型的特殊情况下, Join Buffer 才能派上用场. 在这种情况下, Join Buffer 的大小将对整个 Join 语句的消耗起到非常关键的作用
GROUP BY 关键字优化
group by 实质是先排序后分组, 遵照索引的最佳左前缀.
当无法使用索引列, 增大 max_length_for_sort_data 参数的设置 + 增大 sort_buffer_size 参数的设置
where 高于 having, 能写在 where 限定的条件就不要去 having 去限定了.
来源: http://www.jianshu.com/p/a9c63e55dad8