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底层的查询也是根据排好序的方式来查找。