在 阿里java规范中:
【推荐】SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts
最好。
说明:
1)consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2)ref 指的是使用普通的索引(normal index)。
3)range 对索引进行范围检索。
反例:explain 表的结果,type=index,索引物理文件全扫描,速度非常慢,这个 index 级
别比较 range 还低,与全表扫描是小巫见大巫。
工作中需要优化sql的查询性能,
于是系统学习下sql的性能优化分析
学习自
https://www.cnblogs.com/joimages/p/14549899.html
列名 | 描述 | 备注 |
---|---|---|
id | 多条sql的select执行顺序 | 从大到小执行 |
select_type | SELECT 关键字对应的查询类型 | 连接查询和子查询时才有 |
partitions | 匹配的分区信息 | |
type | 针对单表的访问方式 | 重点关注的 |
possible_Keys | 可能用到的索引 | |
key | 实际用到的索引 | |
key_len | 实际用到的索引长度 | |
ref | 当使用索引列等值查询时,与索引列等值匹配的对象信息 | |
rows | 预估的需要读取的记录条数 | |
filtered | 针对预估的需要读取的记录,经过搜索条件过滤后剩余记录条数的百分比 | |
Extra | 一些额外的信息 | 重点关注的 |
我们重点关注的指标就是type和Extra,
首先介绍下type,性能从上向下越来越差
类型 | 描述 | 备注 |
---|---|---|
system | 如果表里面只有一条数据,而且表使用的存储引擎(如 MyISAM)的统计信息是准确的。 | 条件太苛刻,几乎见不到 |
const | 使用主键或唯一二级索引与常数进行等值匹配时 | 效率高,最好能优化到这个级别,很难 |
eq_ref | 对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多,不能0) | 较难 |
ref | 通过普通的二级索引与常数进行等值匹配时 | 常见,按照创建的组合索引查询基本就是这个 |
range | 使用索引进行范围查询(between,in,<>=) | 常见,阿里要求的最低等级 |
index | 使用索引覆盖,扫描全部索引记录的时候 | 常见,但是不推荐 |
ALL | 全表扫描 常见,但是不推荐 |
Extra
主要尽量达到最优的Using index, 他表示使用覆盖索引,不用回表