A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 dingliu 于 2018-10-23 10:32 编辑

以下的优化方式需要综合考量,难免出现顾此失彼的情况,根据实际应用场景来定:

1、尽量少 join:
MySQL 的优势在于简单,MySQL优化器效率高,对于复杂的多表 Join,一方面由于其优化器受限,所以性能表现不太理想。

2、尽量少排序
排序操作会消耗较多的 CPU 资源,对于MySQL来说,减少排序有多种办法,比如:
1)通过利用索引来排序
2)减少参与排序的记录条数
3)带有DISTINCT,UNION,ORDERBY的SQL语句会启动SQL引擎执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序

4、尽量少or
当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

5、尽量用 union all 代替 union
union 和 union all 的差异主要是前者需要将两个结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

6、尽量早过滤
比如我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,然后再用分好页的结果集与另外的表 Join,这样可以尽可能多的减少不必要的IO 操作,大大节省 IO 操作所消耗的时间。

7、避免类型转换
当 where 子句中出现的字段的类型和传入的参数类型不一致的时候会发生的类型转换,加大CPU的运算

8、能用DISTINCT的就不用GROUP BY
group by 操作特别慢,比如:
select orderid from details where unitprice > 10 groupby orderid,可改为:select distinct orderid from details where unitprice > 10

9、尽量不要用SELECT INTO语句
SELECT INOT 语句会导致表锁定,阻止其他用户访问该表

10、优先优化高并发的SQL,而不是执行频率低的“大”SQL,高并发的 SQL 破坏性比低频率大得多,高并发的SQL一旦出现问题,有可能系统直接崩盘。而对于一些消耗大量 IO 、响应很慢的 SQL,由于频率低,最多就是让整个系统响应慢一点,有缓冲的机会。

扫码关注黑马视频库公众号,免费获取黑马全学科视频教程

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马