一、索引的本质及实现
索引是帮助MySQL搞笑获取数据的排好序的数据结构

索引用的:Btree提升查找效率
如果使用二叉树:

如果使用红黑树(自动平衡):

B树结构

MySQL索引存储结构:B+树(多叉/路平衡树)

B+树存储及查找过程

通过降低树的高度减少磁盘IO速度,那么为何不把所有数据放在一行,只做一次IO?答:这么操作的话会把所有数据加载到内存中,百万行的数据再内存中就要有几个G
输入下图sql语句可查询B+树的一个节点的存储大小,大约16KB

那么为什么16KB?
例如唯一索引bigInt =8B,非叶子节点6B.16KB/8+6B大约等于1170个索引
如果树的高度为3,那么所有叶子节点全部放满的情况下就是1170x1170x16=21902400,大概2100万的数据。
二、常用存储引擎索引实现


区别:数据与索引存储位置不一样
为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
1、底层设计必须要有索引,使用B+树索引存储数据。默认底层遍历所有唯一的一列来做索引,都重复的情况下建立隐藏列来维护整张表的数据索引。
2、使用整型索引之间数据比较大小更快,并且整型占的存储空间小,节省空间
3、为什么自增?叶子节点从左到右增大,使用uuid还要进行大量计算
为什么非主键索引结构叶子节点存储的是主键值?
一致性和节省存储空间
三、索引最左前缀原理
联合索引结构是什么样?

(a,b,c)按建索引的顺序比较大小,先按a比较大小,再b,然后c.中间有查到就不再往下比较。
最左前缀法则:

其中第3条语句会走索引,因为根据索引的结构,按name ,age,position建立。排除name其他索引节点是无序的需要遍历全表索引,引起全文查找。
四、Redis核心数据结构介绍



redis有个非常大的忌讳:bigKey,因为单线程,请求排队,如果一个请求的key和value非常大,会阻塞后面的请求,大数据可以分段存取。



Hash结构再集群模式下使用中的问题:偏移。redis节点会发生变化

可以用redis list结构四线栈,队列,阻塞队列。

单机redis的qps是十万




重点:用户关注模型



本文深入探讨了MySQL的B+树索引机制,包括其存储结构、查询效率及最左前缀法则,同时解析了InnoDB主键的重要性。此外,还介绍了Redis的数据结构特点,如bigKey的避免策略及Hash结构在集群环境下的问题。

被折叠的 条评论
为什么被折叠?



