这一节,我们主要讲一下索引的优化思路,及一些特定类型查询的优化技巧。
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不会进行去重,需要应用自己进行去重。

若有收获,就点个赞吧




