MySQL
B+树结构(二叉排序树)
索引
SQL优化,主要就是在优化索引
索引:相当于书的目录
索引:index是帮助MYSQL高效获取数据的数据结构。索引是数据结构(树:B树(默认)、Hash树…)
索引的弊端:
1.索引本身很大,可以存放在内存/硬盘(通常为硬盘)
2.索引不是所有情况均适用:a.少量数据b.频繁更新的字段c.很少使用的字段
3.索引会降低增删改的效率(增删改 查)
优势:
1提高查询效率(降低IO使用率)
2.降低CPU使用率(…order by age desc, 因为B树索引本身就是一个排好序的结果)
主键索引(primary key)
唯一索引(unique index)
单值索引(index)
复合索引
create 索引类型 索引名 on 表名(表字段)
alter table 表名 索引类型 索引名(表字段)
explain
id
值相同,从上往下顺序执行,值不同,值越大的先执行
子连接,先执行最内括号里的
多表连接,表行数小的先执行
(原因:笛卡尔积,2 3 4,2 * 3 * 4 = 6 * 4 ,3 * 4 * 2 = 12 * 2)
6 < 12 效率高
select_type
查询类型
PRIMARY:包含子查询SQL中的主查询(最外层的)
SUBQUERY:包含子查询SQL中的子查询(非外层的)
SIMPLE:简单查询(不包含子查询、union)
DERIVED:衍生查询(使用到了临时表)
a. 在from子查询中只有一张表(select temp.xx from (selet …) temp)
b. 在from子查询中,如果有table1 union table2 ,则table1 就是 derived,table2就是union
UNION:上例
UNION RESULT:两张表
table
查询的是哪张表
type
索引类型、类型
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery
System > const > eq_ref > ref > range > index > all
首先得有索引才能做优化,不然都是all
system、const只是理想情况,大多数是优化到ref、range级别
system
只有一条数据的系统表
或者
衍生表只有一条数据的主查询
子表只有一条数据
const
仅仅只能查到一条数据的SQL,用于primary key 或unique index
eq_ref
唯一性索引(unique,primary),对每个索引值,返回匹配唯一的行数据(有且只有1个,不能多,不能少)
3行对应3行,索引值对应
3对1 3对 4 不行
where 后面的字段就是查询的索引值
ref
非唯一性索引,对每个索引值,返回匹配所有行(有0,或多个)
range
范围查询,查询指定范围的所有行,where后面是一个范围查询
(between,>,<,>=,<=,in(跟数据量有关,大于数据量一半all))
index
查询全部索引中的数据
查询字段是索引,只需要扫描索引列
all
查询全部表中的数据
查询字段不是索引,要扫描全表
possible_key
可能用到索引键(表字段),可能会有多个,是一种预测
key
实际用到的索引键(表字段)
key_len
索引的长度
作用:判断复合索引是否被完全使用
(a,b,c)三个索引分别多少varchar(10)
utf8:varcahr 1字符=3字节
三个都使用是30、两个20
如果索引字段可以为空,那么len会+1,MySQL会使用一个字节用于标识
复合索引遵循最左匹配原则,在第一个索引能查到后,后面的索引就不起用了
编码
utf8:1个字符3个字节 (null是用一个字节标识,varchar可变长度用2个字节标识)
gbk:1个字符2个字节
latin:1个字符1个字节