首页 > 技术文章 > 关于SQL优化

1394htw 2019-11-24 13:48 原文

一、

第二部分

Calls:调用次数

R/Call:平均每次查询耗时情况 V/M:方差均值比

 

第三部分:详细SQL慢查询参数统计

Rows sent、Rows examine 差别越大,表示做了更多的无用功,索引利用效率差

 

二、线上数据库打开了慢查询日志记录功能的话,对数据库的性能影响大吗?

肯定有一定的影响,微弱,日志文件占用物理磁盘空间,

 

三、哪些SQL需要优化:

1、查询次数多,而且占用时间比较长的SQL

2、IO大的SQL:Rows examine数值比较大的SQL,(是否有必要?是否可以使用limit)

3、未使用索引或者索引利用率不高的SQL(pt-query-digest第三部分 Rows sent、Rows examine 差别大

 

四、BTree索引的有效利用与限制

索引生效的情况:

1、匹配最左前缀

2、全值匹配

3、匹配列前缀

4、匹配范围值

5、精确匹配某列并范围匹配另外一列

 

全值匹配我最爱,最左前缀要遵守;

带头大哥不能死,中间兄弟不能断;

索引列上少计算,范围之后全失效;

Like百分写最右,覆盖索引不写星;

不等空值还有or,索引失效要少用。

 

BTree索引的限制:

1、如果不是按照索引的最左列开始查找,则无法使用索引,

2、不能跳过索引中的列

3、如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找,

 

五、分析SQL低效的原因

1、explain

①索引利用情况

②排序

③临时表

④回表读行

⑤行扫描情况

 

2、Profiles SQL各个子任务资源消耗情况

 

六、修改索引

1、是否有无用的索引需要删除

2、是否可以适当建立组合索引

3、组合索引的顺序是否需要调整

4、前缀索引

5、覆盖索引的利用

 

七、重写SQL

1、是否因为列的计算导致索引失效

2、是否有不需要的列别查询:select *

3、是否有不适当的关联关系导致过多读行

4、是否可以将复杂的SQL拆分

5、是否可以指定使用更好的索引:USE Index

推荐阅读