数据库索引的底层原理
1. 数据库索引
数据库每次做的DML(增删改查)操作都是要进行磁盘IO的读取,每次操作磁盘IO,会消耗很大的时间,所以引入索引这个概念,索引它是将无序的数据变得有序化,即在数据被插入的时候,在内存中会根据索引键对数据进行排序。
1. 内存和外存
内存:即内存卡,读取速度快,但是容量很小,不会长期保存数据
外存:即磁盘,他的读取熟读慢,可能比内存慢上万倍,可以长期保存数据
2. 数据库数据存储地址
数据库的数据往往都是很大的,一般需要存储在外存中,需要的时候需要操作磁盘IO,每次磁盘IO都是很耗费时间的,所有数据库对数据操作优化是,通过索引来提高数据库的查询速度。
3. 数据库索引的种类
1. 主键索引:主键即主键索引,数据库在建表的时候有且只有一个主键,唯一非空
2. 普通索引:普通索引没有限制,index
3. 唯一索引:索引值唯一可以为空,unique index
4. 联合索引:由多个key组成的所有,遵循最左原则
4. 数据库读取数据的过程
数据库执行一条查询语句时,会进行一次磁盘IO,会将该数据的相邻数据同时取出放到内存的缓冲区中,我们称这一组数据为页(page),一页的大小由操作系统决定,4k或者8k,当我们下一次去读取这一页的数据时,会去内存中操作,不会进行磁盘IO操作,大大减少了查询时间。MySQL数据库不管是innoDB还是myISAM引擎,它索引底层数据结构都是B+树。
2. 索引底层数据结构
1. B+树
二叉树的查询时间复杂度是O(logN),即树的高度,但是数据一旦庞大起来,树的深度也是很大的,B+树可以解决树的深度,他的多叉树,可以有效降低树的深度,详细了解树的内容:B树和B+树
3. 为什么使用B+树而不是用B树
1. B+树的磁盘IO次数更少
B+树和B树的区别即使数据的存放位置,B+树的叶子节点存储数据,非叶子节点存放键,B树的数据存放在各个节点上。因为磁盘IO读取存放在内存中的页大小是固定的,B+树的非叶子结点只存放键和指针,那么他可以存放的键就会很多很多,一次磁盘IO读取的键就会更多,树的阶越大,那么树的深度就会降低。
2. B+树查询更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3. B+树有利于范围查询
B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。
4. 不同存储引擎的B+树
1. innoDB
innoDB的存储特点是:表结构单独存放在.frm中,数据和所有存放在ibddataN中,即我们可以通过索引直接在叶子节点读取到数据,但是如果通过其他字段创建了索引,那么它通过普通索引找到存储的主键值,然后再通过主键索引找到响应的数据,这样他的磁盘IO就增加了。
2. myISAM
myISAM的存储特点是:表结构存放在.frm文件中,表数据存放在MYD文件中,索引存放在MYI中,即叶子结点存放的一个地址,指向表数据,我们通过索引找到指定叶子节点,在通过地址找到对应的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!