知识点有可能在pdf里面不全,所以这两个都要看
综上图所述
执行顺序是:id从大到小,若相等就从上往下,id列为null的就表是这是一个结果集,不需要使用它来进行查询。
select_type字段中:
primary:最外层select
derived:临时表(from后边的临时表)
subquery:select后边的临时表
table字段中:代表 表名(包含临时表)
<derived3>:临时表(代表select_type字段中的derived 3是select_type字段中的derived前面的id)
type字段中:
这一列表表示关联类型和访问类型,即mysql决定如何查找效率中的行,查找数据记录的大概范围。
依次从最优到最差分别为:system>const>eq_ref>range>index>all
一般来说,得保证查询达到range级别,最好达到ref
NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引,例如:在索引列中选取最小值,可以单独查找索引完成,不需要在执行时访问表
const:代表常量,相当于这个sql查询速度和查常量(select 1 from dual)一样
system:代表常量一种,表里只有一条数据匹配
eq_ref:代表表中的主键或者唯一键和其他表进行关联 如上图
ref:代表表中的辅助索引与其他表就行关联
index:扫描全表索引,通常扫描二级索引(优化军规里面没有)
index关键点:若查出来的数据在主键索引和辅助索引都有,会优先选择辅助索引,因为辅助索引占得空间小的多(子叶节点存放key),而主键索引占得空间大(子叶节点存放所有数据)
这种sql 虽然提示用了索引,但是还是特别慢需要优化,因为在辅助索引子叶节点遍历所有key(这种会涉及很多io,一个页到下一页就会io)
all:也是用聚簇索引(主键索引)在叶子节点从头往后遍历,非常慢(多次io)
比index慢的原因是叶子节点存放数据,所以io次数更多
show warning 可以查询sql优化阶段情况
extra:额外信息(重要 )
using where:代表索引失效,进行回表操作
using index:代表不进行回表操作(称覆盖索引)
using filesort:代表的是 where和orderby连起来是否跨列使用,跨列会出现using filesort,若不跨列就不会出现 (order by是不用索引的)
简单一点总结:运用临时空间进行了排序
例如上sql1:连起来代表 a1,a2,a3(orderby不适用索引),所以最终用联合索引中的a1a2
例如上sql2:连起来代表 a1,a3(orderby不适用索引)并且夸列了,所以最终用联合索引中的a1,并且extra会出现using filesort
Using index:使用了覆盖索引(不需要回表)
using index condition:使用了索引下推
possible_keys列有值,key没值这种情况:
因为idx_age可以使用,但是mysql认为不使用索引效果更快
两表索引调优
谨记:小表驱动大表
以上两个循环,最终都会循环3000次,但是对于双层循环来说,一般建议,将数据小的循环方外层,数据大的循环放内层,这样效率最快
1、先考虑sql连接方式
若sql是左连接,给左表关联字段添加索引
若sql是右连接,给右表关联字段添加索引
2、考虑where条件,然后对应的单表添加索引
三表优化索引:
1、小表驱动大表
2、索引建立在经常查询的字段上