- 索引是帮助mysql高效获取数据的排好序的数据结构
- B+Tree(B-Tree)
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接(双向)-便于范围查找,提高取件访问的性能
- MYISAM索引文件和数据文件是分离的(非聚集),一个表包含MYD(数据),MYI(索引),frm(表结构)三个文件
- 判断where后的条件是否是索引字段,否则全表扫描
- 是索引字段,在MYI文件索引的根目录下查找目标值,获取该条数据的磁盘文件地址
- 根据地址在MYD文件获取该数据
- InnoDB索引实现(聚焦)
- 表数据文件本身就是按B+Tree组织的一个索引文件
- 聚集索引-叶节点包含了完整的数据记录,非聚集索引-叶节点包含了数据的地址
InnoDB是聚集索引,MYISAM是非聚集索引,聚集索引相比非聚集索引查询效率要高一些
- 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
如果没有建立主键,mysql会对数据表的列从左到右进行查找,找到符合唯一索引的列作为主键处理,如果没有这样的列,mysql会新增一个隐藏列;使用整型的自增主键比较大小更快,且占用的存储空间更小(如uuid,字符串比较大小更复杂,且占用的存储空间更大)
- 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
非主键索引先根据索引列找到主键值,再根据主键值扫描主键索引树,一共扫描两棵索引树
- 联合主键索引数据结构
首先比较第一列索引的值,如第一列的值相同,再比较第二类索引的值,以此类推
- Hash索引实现
- 首先将索引的值作hash运算得到散列值,根据散列值可以直接获取存储此条记录的磁盘文件指针,此方法效率很高,但致命缺点是无法实现范围查找