explain 执行计划
type
1、all
全表扫描
2、index
全索引扫描
3、range
从索引中查找
4、ref
返回所有匹配某个单个值的结果
5、eq_ref
最多返回一条符合条件的结果,通常用在唯一索引和主键索引上
extra
1、use index
使用索引覆盖,查询索引就可以找到需要的数据
2.use where
需要会表进行查询
3、use filesort
对结果使用外部索引排序
4、use temporary
对查询结果进行排序时,使用临时表,一般用于排序、分组和多表join
key
mysql实际使用的索引
为什么要使用索引
1、加快查询数据的速度
2、帮助数据库避免排序和创建临时表
3、随机io变成顺序io
4、通过创建唯一索引,保证数据库中数据的唯一性
索引缺点
1、索引会影响增删改的速度,每一次修改数据都会额外去维护索引
2、创建的索引会占用物理空间
hash索引和b+树索引
1、hash索引只适合等值查询,无法进行范围查找
2、用hash索引查出的数据无法进行排序。
3、存在多个值相同的情况,效率会变得很慢,存在哈希碰撞
4、hash索引不支持多列联合索引的最左匹配原则
索引分类
1、 主键索引
2、 普通索引
3、 唯一索引
4、 组合索引(最左前缀)
唯一索引和主键索引的区别在于主键索引不能为null
红黑树和avl树在内存中使用的数据结构,因为不可能将数据库中的数据全部加载的内存中,
因此使用红黑树会造成频繁io,导致效率低下
b树和b+树
b树
1、书内存储数据
2、叶子节点无链表
b+树
1、叶子节点存储数据
2、叶子节点存储数据
如何避免回表:
查询数据尽量走索引
索引覆盖:
一个组合索引包含了满足查询结果的数据
mysql索引失效
1、范围查找之后的条件不会用到索引
2、where后面接表达式
3、发生隐性转化
几种常见平衡树的比较
avl树
avl树是一种绝对平衡的树,即左右子树的高度差不大于1,添加或者删除元素
通过翻转来维持平衡。
b树
b树也是一种平衡树,现对于avl树,它的每一层节点存放的数据更多,树的高度
遍地,减少了io的次数。b树的查找速度不够稳定,在进行范围查找的时候,需要
进行中序遍历,增加了io的次数。
b+树
b+树所有的数据都存放在叶子节点,并且用链表进行连接,因此在进行范围查找时,
会很方便。由于非叶子节点不存储数据,因此可以存储更多元素,可以减少io查询次数。
网友评论