目录
1.索引的定义
索引是存储引擎用于快速找到数据记录的一种数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引一般存于磁盘中,是一种以空间换时间的方案。
简单来说索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。但同时,为了这个查询速度,字典表就要多花几页纸来存储音序表。
同时,尽管索引可以大大提高查询速度,但当对表进行增加、删除、修改时,由于索引也要动态维护,索引会降低更新表的速度。
针对以上问题,一种解决方案则是需要大量更新数据时,先删除索引,再进行数据的更新。
2.索引的原理
其本质是不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变为顺序的事件。也就是说,索引可以帮助我们总是用同一种查找方式来锁定数据。
简单来说,就是把数据分成页,比如第一页存储第1到第100条数据,第2页存储101到200条数据(MySQL中每一页最大为16k,存满一页就新增一页)......当需要查询第150条数据时,根据索引会最终直接分页到第2页进行查询。这样在查找数据时就能去除大多数无用的数据。
在MySQL中,基本的数据页模型如下:
每一页数据中包括record_type(2位最小记录,3位最大,0位普通用户数据,1为B+ tree结构中非页节点的目录项)、next_record指向下一条记录的地址、用户数据。数据与数据之间形成单链表,从小指向大。
3.Hash索引与B+ Tree索引
MySQL的存储引擎主要使用B+ Tree和Hash两类数据结构作为索引的存储结构。
(1)Memory表(只存于内存中,断电会消失,适用于临时表)默认索引类型为Hash索引。
Hash索引把数据以hash形式组织起来,每个键只对应一个值,因此查找一条记录时,经过一次哈希计算即可找到对应的键值,速度非常快。但也由于散列进行分布,所以Hash索引不支持范围查找和排序功能。
(2)B+ Tree是innoDB和MyISAM存储引擎模式的索引类型。
B+树索引中,非叶节点仅存放目录项(即非叶子节点上仅存储键值),所有数据均存储在叶子节点,叶子结点之间组成链表(双向链表,既能左遍历又能右遍历)。如下图(图中数据页结构为简化版)所示:
根据上图B+ Tree结构,如果需要查找id=5的数据:
- 从根节点找到页1开始查询,加载关键字1、6、12,判断1<5,5<6,根据指针p1找到页2;
- 加载关键字1、4、6,判断5>1,5>4,5<6,根据指针p2找到页6;
- 到达叶节点,在关键字链表中命中最终结果5,读取数据行;
相对于Hash索引,B+ Tree在查找单条记录时,由于需要从根节点到叶节点逐级寻找,速度较慢,更适合范围查询和排序操作。
(3)为什么使用B+ Tree
B+树是一种矮壮型的树形结构,这就意味着他的层级较小,存储的叶子节点更多,这样的话就可以大大的降低查询时检索的次数,进行IO的次数越少,从而提高查询效率。
同时相比于B 树,由于B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比B树更矮胖,即查询底层节点的磁盘 I/O次数会更少。
最后,由于B+ 树叶子节点之间用链表连接了起来,有利于范围查询。
4.聚簇索引和非聚簇索引
MySQL的索引类型和存储引擎相关,根据其物理实现方式分为聚簇索引和非聚簇索引,关键在于数据跟索引是否存储在一起。数据绑定一起的是聚簇索引,存储的数据为全量的用户数据;否则为非聚簇索引。
聚簇索引是根据主键搭建起来的B+ Tree,innodb会自动帮我们创建。其对于主键的范围查找和排序速度都非常快。
非聚簇索引键为条件进行查询时,找到叶子节点的数据之后,再通过叶子节点的id,再去聚簇索引中查询一遍,才能拿到所有字段。
Innodb存储引擎在进行数据插入时,数据必须要跟其中一个索引(主键>唯一键>rowid)放在一起。而为了避免数据冗余存储,其他的索引的叶子节点存储的是聚簇索引的key值。所以,innodb中既有聚簇索引,又有非聚簇索引。
MySIAM中没有聚簇索引。
5.索引的分类
而我们在实际开发中,创建的索引又分为:
1)NORMAL:普通索引,MySQL中最基本的索引,任何一列上都可创建。
2)UNIQUE:唯一索引,该索引列的所有值都只能出现一次,即必须唯一。主键索引是唯一索引中的一种。
3)FULLTEXT:全文索引,主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
4)SPATIAL:空间索引,对空间数据类型的字段建立的索引,主要用于地理空间数据类型 GEOMETRY,只能在存储引擎为 MyISAM 的表中创建。
转载:https://blog.csdn.net/tang_seven/article/details/129150595