MYSQL性能优化:SQL语句优化

《MYSQL性能优化:SQL语句优化》 思维导图

SQL优化原则

优化更需要优化的Query

优先优化高并发低消耗的SQL

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

两个 Query 每小时所消耗的 IO 总数目是一样的。假设优化第一个 Query,从20个IO降低到18个IO, 则节省了20000 (IO/小时)。而如果希望通过优化第二个 Query 达到相同的效果, 我们必须要让每个 Query 减少 20000 / 10 = 2000 IO,难!

定位优化对象的性能瓶颈

SQL运行较慢有两个影响原因:IO和CPU,明确性能瓶颈所在,明确优化目标。通过系统自带的 PROFILING 功能找出一个 Query 的瓶颈所在。

从 Explain 入手

任何SQL的优化,都从Explain语句开始。Explain语句能够得到数据库执行该SQL选择的执行计划。

永远用小结果集驱动大的结果集

永远用小结果集驱动大结果集,而不是小表驱动大表。

在索引中完成排序

只取出自己需要的 Columns

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

使用最有效的过滤条件

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

避免复杂的JOIN和子查询

1.复杂的JOIN和子查询,需要锁定过多的资源
2.不要过多依赖SQL的功能,把复杂的SQL拆分为简单的SQL
3.MySQL子查询性能较低,避免使用

优化JOIN

JOIN原理

在 MySQL 中,只有一种 Join 算法 Nested Loop Join,就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据, 再一次通过循环查询条件到第三个表中查询数据,如此往复。

JOIN 语句的优化

1.减少Join 语句中的Nested Loop 的循环总次数,用小结果集驱动大结果集

为什么?因为驱动结果集越大,意味着需要循环的次数越多,也就是说在被驱动结果集上面所 需要执行的查询检索次数会越多。比如,当两个表(表 A 和 表 B) Join 的时候,如果表 A 通过 WHERE 条件过滤后有 10 条记录,而表 B 有 20 条记录。如果我们选择表 A 作为驱动表,也就是被 驱动表的结果集为 20,那么我们通过 Join 条件对被驱动表(表 B)的比较过滤就会有 10 次。反 之,如果我们选择表 B 作为驱动表,则需要有 20 次对表 A 的比较过滤。
当然,此优化的前提条件是通过 Join 条件对各个表的每次访问的资源消耗差别不是太大。如 果访问存在较大的差别的时候(一般都是因为索引的区别),我们就不能简单的通过结果集的大小 来判断需要 Join 语句的驱动顺序,而是要通过比较循环次数和每次循环所需要的消耗的乘积的大 小来得到如何驱动更优化。

2.优先优化Nested Loop 的内层循环
3.保证Join 语句中被驱动表上Join 条件字段已经被索引
4.扩大join buffer的大小

ORDER BY 的实现与优化

实现原理

在 MySQL 中,ORDER BY 的实现有如下两种类型:
1.通过有序索引而直接取得有序的数据。利用索引实现数据排序的方法是 MySQL 中实现结果集排序的最佳做法,可以完全避免因为排序 计算所带来的资源消耗。
2.通过 MySQL 的排序算法将存储引擎中返回的数据进行排序然后再将排序后的数据返回给客户端

优化方案

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

参考资料:MySQL性能调优与架构设计

    原文作者:easy_one
    原文地址: https://www.jianshu.com/p/b74b386984de
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞