⌚【Mysql学习笔记】索引篇
type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
AI summary
索引的分类
按照数据结构分
- B+ 树索引
- hash索引
- full-text索引
按照物理存储结构分
- 主键索引(聚簇索引)
- 二级索引
按照字段分
- 主键索引
- 唯一索引
- 普通索引
- 前缀索引
为什么使用了索引后,查询会加快
Mysql默认使用innodb存储引擎,索引数据结构默认为B+树
- 索引使用树形结构组织数据,相比于无索引的场景,
查询的时间复杂度由O(N)变为O(logN)
,大大减少了需要扫描的数据量
- 同时,将随机的IO转变为了顺序IO,减少了等待磁盘旋转的时间
从数据页的角度看B+树
innodb的数据是按【数据页】为单位来读写的;数据库的I/O最小单位是16KB
数据页的组成部分

不同的数据页之间通过指针相互连接,构造一个双向的链表。

不同的数据页的物理地址不是连续的,但在逻辑上是连续的。
具体的数据页内部的数据存储
将数据分为多个分组,每个分组中有相应的数据,数据之间通过单项链表进行连接

具体的查询过程
- 从根结点开始,通过二分法找到id对应存储的page
- 在page中(叶子结点),在多个slot中使用二分查找,id对应数据所在的slot
- 找到slot后,在这个slot中遍历一遍,找到对应id的具体数据

为什么Mysql的索引数据结构是B+树
- B+树的非叶子结点存放的仅存放索引,因此在数据量相同的情况下,相比于同时存储数据和索引的B树,
能够存储更多的索引内容
,所以B+树会更加矮胖一些,查询底层节点的IO次数更少
- 同时,B+树的树高度稳定,一般只有三到四层,所以
查询效率也稳定
- B+树的非叶子结点中有大量的冗余节点,当
插入、删除节点时
,B+树都不会发生太大的变化,效率比较高
- B+树的叶子结点之间通过链表连接,
有利于范围查询
什么场景需要建立索引
- 字段的区分度高
- 字段经常用于where查询、
group by
、order by
索引失效的场景
- 对于前缀索引:使用了
%xx%
或%x
- 对于联合索引:不满足最左前缀原则
- 对于普通索引:对于索引字段进行计算,类型转换的场景
- where子句中包含
or
如何进行索引优化
- 首先主键是自增的
- 防止索引失效
- 覆盖索引优化
- 前缀索引优化
explain中字段的含义

- possible_keys:可能使用到的索引
- key字段表示世纪使用的索引,如果为NULL,则说明没有使用索引
- key_len表示索引的长度
- rows表示扫描的行数
- type表示数据扫描的类型,这是我们需要重点关注的部分
types
常见的扫描查询效率由低到高排序
- ALL:全表扫描
- index:全索引扫描
- range:索引范围扫描
- ref:非唯一索引的扫描
- eq_ref:一般用于多表的联查
- const:使用常量值进行了查询,一般是
where id=1
这种
Prev
【Mysql学习笔记】事务篇
Next
calico
Loading...