? 索引是帮助MySql高效获取数据的排好序的数据结构
二叉树
红黑树
hash表
B-Tree
B+Tree
红黑树结构
? 当一边的结构过于深的时候会进行一次重排,让树结构相对来说平衡
?
? 二叉树 结构
? 如果数据为线性增长的数据则会变成单边树
B-Tree数据结构
? 叶节点具有相同的深度,叶节点指针为空,所有索引元素不重复,节点中的数据索引从左到右依次递增排列
B+Tree数据结构(Mysql使用的数据结构)
他解决了红黑树的高度不可控的问题
?
mysql为什么选择B+Tree不选择B-Tree?
? 因为B+Tree的索引结构决定的,B+Tree的非叶子节点不存储数据,这样在查找的时候load进入内存的时候能够load更多的索引,内存在load的时候只会一次load16KB的内容,如果飞叶子结点存储的数据就会导致占用更多的空间,B+Tree在飞叶子结点不存储数据,每个非叶子节点的索引为int类型的话,一个节点会占用8bit大小,下级非叶子索引占用的位置为6bit,这样的索引在load的时候一次大概会load的条数1170条,三层这样的结构会load大概2100万条,大大增加的查询效率,减少了磁盘IO,B+树指针
? B-Tree树会在每一个节点下面存储数据,这样在检索load进入内存的时候数据也会被load进去,减少了索引的数量,如果是相同数量级别的表,深度会很深,大大增加了磁盘IO的次数
frm:表结构 from
MYD:MyIsamData表内容
MYI:MyIsam Index 表索引
查找方式:
1:使用B+Tree的数据结构将索引load进入内存,
2:查找到指定索引(MYI),去找到对应的存储位置
3:通过对应的位置,去MYD表中取找对应的数据
frm:表结构
idb:表数据和index索引的存储
什么是联合索引?
联合索引是多个索引组合在一起的索引,在进行查询的时候需要保证最左前缀原则!
例:
? select * form table where name = “q” and age =“30”
? select * form table where age =“30”
? select * form table where age =“30” and position = “dev”
?