暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL-性能优化(七)

时光旅行线 2022-03-21
289



这一节,我们主要讲一下索引的优化思路,及一些特定类型查询的优化技巧。


1. 索引优化思路

1.explain说明

各属性说明:

  • type:连接的类型,性能由好到差。(阿里规约推荐至少要达到range级别,最好ref)

    • system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现

    • const:最多一个匹配行,使用主键或unique索引

    • eq_ref:返回一行数据,通常在联接时出现,使用主键或unique索引时出现

    • ref:使用key的最左前缀,且key不为主键或unique键

    • range:索引范围扫描,索引扫描开始某一点,返回匹配的行,一般在where语句中出现了索引字段between、<、>、in等的查询

    • index:以索引的顺序进行表扫描,优点是不排序,缺点是可能会耗时较长

    • all:全表扫描, 尽量避免

  • extra

    • using index :索引覆盖,查询只用索引即可,无需读取数据块

    • using where :存储引擎返回记录给执行引擎后根据where语句再做过滤

    • using temporary :使用临时表,通常在GROUP BY, ORDER BY出现

    • using filesort :用至非索引顺序的额外排序,当ORDER BY没用到索引时出现

    • using index condition :索引下推

  • possible_keys:显示本次查询可能使用的索引

  • Key:优化器决定采用哪个索引来优化对该表的访问,可通过use index 给出建议

  • Rows:MySQL估算的为了找到所需记录而需要检索的行数 ,作为优化器选择key的参考, 越小越好。但是当sql使用limit时,Rows不会改变。

  • key_len:使用的索引左前缀的长度(Bytes),亦可理解为使用了索引中哪些字段

    • 定长字段:int占4个字节、date占3个字节、timestamp占4个字节,char(n) 需要 [n * 编码字符所占字节],如utf8mb4编码,则长度为n * 4 个字节

    • ALLOW NULL的字段:需要加1个字节来标记是否为NULL

    • 变长字段varchar(n):需要 [n * 编码字符所占字节数 + 2 ]个字节,额外的2字节用于记录长度

    • 不损失精确性的情况下,key_len越小越好,移除不用的字段


2.优化思路流程图


2. 优化特定类型的查询

1.count() 当统计某个列时,如果是null,就不统计。最简单的方法就是使用count(*)

一个减少扫描行数的方法是,使用扫描行数少的操作的结果进行计算得到

一种粗略的计算逻辑是使用explain

另一种优化的方法是加入汇总表或者缓存

2.优化关联查询

A.确保在on和using子句中的列上有索引。在建索引的时候,需要考虑关联的顺序。比如A->B 的话,on的列在A中就不必要加索引

B.确保group by 和 order by中的表达式中只涉及一个表中的列。这样才有可能使用索引来优化这个过程。

3.优化子查询

尽可能的使用关联查询代替

4.优化group by和distinct

可以使用索引来优化。如果不行的话,可以适用标识列作为分组列进行优化。

5.优化limit分页

A. 使用索引进行优化 B.通过扫描索引来拿到主键,然后进行延迟关联拿到需要的字段。或者只进行索引扫描 C.通过记录这次查询的分页的初始位置的索引,来避免使用偏移量。D.其他方法包括使用汇总表事先计算好结果

6.优化union查询

可以手动加上all,进行union all查询。但是这样的话,mysql不会进行去重,需要应用自己进行去重。


若有收获,就点个赞吧





文章转载自时光旅行线,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论