SQL优化

JOIN的优化

1,JOIN的原理:
在mysql中使用Nested Loop Join来实现join;
A JOIN B:通过A表的结果集作为循环基础,一条一条的通过结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果;
2,JOIN的优化原则:
1,尽可能减少Join 语句中的Nested Loop 的循环总次数,用小结果集驱动大结果集;
2,优先优化Nested Loop 的内层循环;
3,保证Join 语句中被驱动表上Join 条件字段已经被索引;
4,扩大join buffer的大小;

JOIN优化原则
1,尽可能减少Join 语句中的Nested Loop 的循环总次数,用小结果集驱动大结果集;
2,优先优化Nested Loop 的内层循环;
3,保证Join 语句中被驱动表上Join 条件字段已经被索引;
4,扩大join buffer的大小;

优化Order by

ORDER BY 实现原理:
1,通过有序索引而直接取得有序的数据;
2,通过MySQL 的排序算法将存储引擎中返回的数据进行排序然后再将排序后的数据返回;

优化方案:
1,加大max_length_for_sort_data 参数;
2,去掉不必要的返回字段;
3,增大sort_buffer_size 参数;

优化group by

优化distinct

SQL优化原则

选择需要优化的SQL

1,优先优化高并发低消耗的SQL;

1,1小时请求1W次,1次10个IO;
2,1小时请求10次,1次1W个IO;

从IO消耗,优化难度,CPU消耗进行比较;

2,定位性能瓶颈;

1,SQL运行较慢有两个影响原因,IO和CPU,明确性能瓶颈所在;
2,明确优化目标;

explain和profilng

1,任何SQL的优化,都从Explain语句开始;Explain语句能够得到数据库执行该SQL选择的执行计划;
2,首先明确需要的执行计划,再使用Explain检查;
3,使用profile明确SQL的问题和优化的结果;

用小结果集驱动大结果集

JOIN原则;
1,不是小表驱动大表,是小结果集驱动大结果集;

在索引中完成排序

使用最小columns

1,特别是需要使用column排序的时候;
2,减少网络传输数据量;
3,MYSQL排序原理,是把所有的column数据全部取出,在排序缓存区排序,再返回结果;如果column数据量大,排序区容量不够的时候,就会使用先column排序,再取数据,再返回的多次请求方式;

使用最有效的过滤条件

1,过多的WHERE条件不一定能够提高访问性能;
2,一定要让where条件使用自己预期的执行计划;

避免复制的JOIN和子查询

1,复杂的JOIN和子查询,需要锁定过多的资源,MYSQL在大量并发情况下处理锁定性能下降较快;
2,不要过多依赖SQL的功能,把复杂的SQL拆分为简单的SQL;
3,MySQL子查询性能较低,应尽量避免使用;

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注