1. 索引
索引:是排好序的数据结构。很重要这句话
以至于有一个索引是 (“name”,"age")的话
查询语句是
select age from student where age = 1 是不会进入索引的,因为底层索引是排好序的
索引底层如果因为的BTree的话就会按照索引创建顺序,依次排序
2.B-Tree和B+Tree的区别
B+Tree是B-Tree改进版,适用于Mysql,
B+Tree中的非叶子节点的data移动到叶子节点,但是B-Tree是存在Data,不存在Data可以节省空间,存储更多非叶子节点
B+Tree叶子节点之间是从左到右依次递增排好序的,叶子节点之间是有相互指针箭头的,主要改进是为了范围查找
二叉树和红黑树(二叉平衡树)的高度不可控
B+Tree第一层非叶子节点是常驻磁盘的
3.存储引擎
存储引擎是形容数据库表的,表信息是存储在本地磁盘上的
一. MylSAM存储引擎:索引文件和数据库文件是分离的(非聚集)
MylSAM是表级锁,所以对写操作不友好
本地磁盘存储表的时候有三个文件夹
frm:表结构相关信息 MYD :MylSAM + data数据的简写 MYI : MylSAM + index的简写
查询步骤:举例COL1 = 1
第一步:先检查COL1是否是索引字段
第二步:在MYI中查找索引文件,找到磁盘地址
第三步:根据磁盘地址找到MYD文件中对应的主键从而找到对应的数据
二.InnoDB引擎 (聚集)
InnoDB是行级锁,对写友好,查询慢,支持事务
本地磁盘存储表的时候有两个文件
frm:表结构相关信息 idb : index + data
查询步骤:举例COL1 = 1
第一步:先检查COL1是否是索引字段
第二步:在idb中查找索引文件和数据文件
既是索引未见也是数据文件,在ibd就可以查找
聚集索引,叶节点包含了完整的数据记录
4. 问题汇总及解答
一,不建立多个单值索引
二,索引最左前缀原则:不能里哦啊过任何一个值,只能从第一个开始用,从第二个是不走索引的,原因是索引都是排好序的数据结构,从第二个开始查询就不是排好序的了
三,聚集索引:叶节点包含数据+索引 (一个文件中查询)
非聚集索引:叶节点只包含索引:两个文件中查询,数据和索引是分开的
四:InnoDB表必须建立主键,并推荐使用整形的自增类型
设计如此,如果没有主键会自己找一列,当前列的数据是不重复的,会作为默认主键,如果没有会建立隐藏列增加磁盘压力。
自增的整型是因为会经历比大小,整型比较快,省时间和内存,占用存储空间比较小,效率比较高
五,为什么非主键的索引结构叶子节点存储的是主键值
一致性得到保证,而且节省存储空间
六,为什么索引用B+tree而不用Hash的原因
因为范围查找。