Mysql索引底层原理 -- 来自bilibili 程序汪追风


1. 索引数据结构 红黑树,hash, B+树 详解

索引本质 : 就类似课本的目录页。

注意1: 索引是一种数据结构,假设 在table > col2 中建立索引, 其实就是将 col2这列数据 存放在二叉树中。

二叉搜索树查找:时间复杂度 O(logn)

 

学习数据结构的网址: 

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

https://visualgo.net/zh

 

注意2: 数据库插入数据时, 先维护索引字段,再到表中插入数据

 

红黑树: 也叫二叉平衡树

 

为什么mysql底层没有用红黑树呢? 有什么缺点?

假设表中有100万行数据, 那么树的高度h  100W = 2 ^ n    n就是树的高度。  

所以进行范围m次查询, 时间复杂度为 O(mlogn). 

有没有更好的存储方式呢?改造 控制高度在3-5之间,就能存储几千万的数据呢? 这里有点像哈希冲突中的解决方法 > 拉链法

这里我们对红黑树进行改造,变为B树

B树结构如下:  控制高度,从每个节点横向扩充。

B+树: 在B树上进行改进。    多叉平衡树

改进点:1. 非叶子节点不存储data,只存储索引。 2.叶子节点用指针连接,提高区间访问性能。

   

 

     

bigint = 8byte

1kb = 1024byte

2. 索引是怎么支撑千万级表的快速查找

B+树的特性: 树的深度 h = 3 , 就能轻轻松松存储几千万行的索引元素。 查找20 只需2次IO

这就是为什么慢查询的优化方式: 建索引。

 

3. myisam存储引擎索引实现讲解

存储引擎针对的是表还是数据库?   是形容表的。

MyISAM 索引文件和数据文件是分离的 (非聚集)

mysql底层查找过程,首先会先判断 col1 是否为索引字段,如果是索引字段,先去MYI索引文件中,根据B+树的特性,从根节点开始,根节点是常驻内存的。从内存中按照元素的特性逐一比对,当找到49时, 将49指针指向MYD文件的数据加载进来。 -- 采用MyISAM存储引擎

 

4.InnoDB存储引擎索引实现

frm 存的是表结构
ibd  存储的索引字段+数据

innodb与myisam不同的是  
1. innodb  ibd文件整合了索引和数据, 而myisam 则是将其分为 MYI + MYD
2. innodb 叶子节点存储的是 实打实的数据, 而myisam存储的则是指针地址
3. innodb  聚集索引    myisam 非聚集索引

聚集索引 == 聚簇索引
聚集索引 : 说白了 就是 数据+索引 是存储在一个文件。
非聚集索引: 索引 和 数据是分开存储的。
聚集索引查找的效率 > 非聚集索引

为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
1. mysql 选用 innodb, 默认加一列数据作为主键,用来组织表的数据
2. 性能好,磁盘利用率高

为什么用自增?
innodb会按照树的特性,来维护各个节点。

指针的作用是?
可以快速找到下一个元素。
支持范围查找。
select * from table where col1 > 20.   找到20后就顺腾摸瓜。 快

 

联合索引的底层存储结构长什么样?

\

最左原则: 指的就是先按 col1 排, 再col2排, 再col3排。  3列都是索引,且不能跳过查询。
为什么不能跳过前面的字段?因为innodb存储引擎,会按照建立索引先后排好序,而mysql底层的查询也是根据排好序的方式来查找。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值