定义:索引是排好序的数据结构
常见的问题:
1)Mysql常用到的存储引擎:MySIAM和Innodb
2)索引的实现级别是表级别
- 索引为什么不用二叉树?
二叉树的高度不可控,避免出现深度过大的情况 - 索引为什么不用btree
Degree 节点的数据存储个数 :叶节点具有相同的深度;叶节点的指针为空;节点中的数据key从左到右递增
1) Tree中的度为什么不能无限增大?
btree的区间访问性能不高 - 索引实现数据结构有两种:hash和B+tree(degree的概念,一般容量大于15/16就会进行分裂)
在使用navicat新建索引的时候可以选择新建索引的类型
1)使用hash无法进行范围查询 (在某些业务场景中可以用到)
2)B+tree
特点:非叶子节点不存储data,只存储key,可以增加度(一般会超过100,因此h一般在3~5之间)
叶子节点不存储指针
顺序方位指针,提高区间访问的性能 - 索引实现方式
1)MyISAM索引实现(非聚集)如下图所示:
主键索引和非主键索引的查询方式都是一样的:因此在查找的时候首先通过聚集索引找到对应的指针,然后在从数据表中找到对应的数据
索引文件和数据文件是分离的(存储的时候有三个文件)
2) innodb索引实现(使用的最多)聚集索引:索引和数据放在一起叫做聚集索引
存储的文件只有两个
问题:
innodb的为什么必须要有主键:
innodb中数据格式就是按照主键去组织的,如果在没有维护主键,那默认的主键是ID
innodb推荐的主键是自增的主键
使用uuid当做主键缺点:
1)比较占内存
2)比较效率较低
3)使用uuid只能把数据插入到后面
根据加载的原则,会将当前页的数据load到内存中
数据文件本身就是索引文件
表数据文件本身就是按照B+tree组织的一个索引文件
聚集索引-叶子节点包含了完整的数据记录
为什么InnoDB表必须有主键,并且推荐使用整形的自增主键
为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
关键点: 主键索引中的叶子节点,存储的是整行的数据
非主键索引(辅助索引)中存储的是主键值