什么是索引?
索引类似图书的目录检索,可以提高数据检索的效率,降低数据库的IO成本
简单理解:快速查找排好序的一种数据结构
链表----二叉树-----平衡二叉树---(减少旋转的次数)--红黑树----B树---B+树
当数据存在内存中,红黑树的效率非常高,但是文件系统和数据库都是存在硬盘上的,如果数据量大的话,不一定能一次性加载到内存中、
所以一棵树都无法一次性加载进内存,又如何谈查找
因此就出现了专为磁盘等存储设备而设计的一种平衡多路查找树,也就是B数
与红黑树相比,在相同节点的情况下,一颗B/B+树的高度远远小于红黑树的高度
3 阶的树,节点最多存储 2 个,4阶最多存储3个。。。。。。
对于右边的那颗高度为3的树:
查找数字7 : 3步
查找数字10: 2步
查找1-5 : 过程相当于树的遍历,效率低,需要的步骤多
在计算机中,所有与空间相关的东西都是按照块(block)进行存取和操作的
B+树出现可以说是解决了B树的范围查找效率慢的问题
B树里面是每个节点都存储数据,而B+树的数据是存储
在叶子节点
B+树的优势是什么?
1.磁盘读写的代价更低
B树的数据和索引都在同一个节点上,那么每个块中包含的索引是少量的,如果想要去除比较深层的数据,意味着要读取更多的块,才能得到想要的索引和数据,那么就增加了IO次数
而B+树中每个块能存储的索引是B树的很多倍,那么获取比较深层的数据,也只需要读取少量的块就可以,那么久减少了磁盘的IO次数
2.随机IO的次数更少
随机I/O是指读写操作时间连续,但访问地址不连续,时长约为10ms
顺序I/O是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据,时长约为0.1ms
在相同情况下,B树要进行更多的随机IO,而B+树要进行更多的顺序IO,因此B+树效率也更加快
3.查询速度更稳定
由于B+树非叶子节点不存储数据,因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的
MySQL索引实现的总结(必背)
在数据库中,索引是提高数据的检索速度的,而索引是基于B+树的数据结构实现的
使用B+树的好处是:1.降低了磁盘读写代价 2. 顺序I/O提高效率 3.查询速度更加稳定
聚簇索引 和 非聚簇索引
索引和数据在一起就是聚簇索引,不在一起就叫非聚簇索引
5.7以后的mysql默认引擎都是InnoDB
在索引的分类中,我们可以按照索引的键是否为主键来分为“主索引”和“辅助索引”
因此:主索引只能有一个,辅助索引可以有很多个,只有主键索引为主索引,其他都是辅助索引
InnoDB中主键索引为聚簇索引,辅助索引是非聚簇索引:这句话的理解:
主键索引中通过B+树找到的叶子节点的数据包含了所有的数据
辅助索引的叶子节点的数据仅仅包含了辅助节点的数据,不包含所有的数据,如果需要索引外的内容,则需要回表
InnoDB和MyISAM的区别
1、数据的存储方式:
- InnoDB由两种文件组成,表结构,数据和索引
- MyISAM由三种文件组成,表结构、数据、索引
2、索引的方式:
相同点:都是基于B+树的数据结构建立的
不同点:InnoDB中主键索引为聚簇索引,辅助索引是非聚簇索引
MyISAM中数据和索引存在不同的文件中,因此都是非聚簇索引
3、事务的支持:
innnoDb: 支持事务
MyISAM:不支持事务