一、索引的本质及实现
索引是帮助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是十万
重点:用户关注模型