索引
描述
索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与
WHERE子句中的条件匹配,并检索这些行的其他列值
数据结构
B Tree的变种,B+ Tree, 左节点<根节点<右节点, 相邻子节点有联系(加快范围查找查询)
父节点为子节点值复制一份维护
InnoDB主键数据结构
各节点存放索引值,叶子节点额外存放行数据
为什么一定要主键,递增且为整数,为什么叶子节点存放的是整行数据而不同MyISAM一样存放文件行数据指针
1.数据存储引用的B+Tree结构,需要有序,且叶子节点绑定整行数据,所以需要;递增是为了数据在插入是按顺序插入,
不是随意插入导致节点分裂增加树再平衡的可能性,影响性能;整数,所占空间较小,比较方便
2.可以减少磁盘I/O,加快查询速率
InnoDB辅助索引数据结构
各节点存放着索引值,叶子节点额外存放主键值
为什么不是存放整行数据或存放值而不是和MyISAM一样存放文件行指针
1.减少空间;2.主键值可以根据主键索引树查出,若是已经在树已经在内存中可以减少与磁盘的I/O,
比较符合使用场景;绑定的索引文件指针变更,辅助索引不需要同步变更(个人想法,暂时未找到材料证明)
MyISAM索引数据结构
各节点存放着索引值,叶子节点额外存文件行数据指针
注意
尽管可能会为查询中使用的每个可能的列创建索引,但是不必要的索引会浪费空间和时间,使MySQL难以确定要使用的索引。
索引还会增加插入,更新和删除的成本,因为每个索引都必须更新。您必须找到适当的平衡,才能使用最佳索引集来实现快速查询
主键
主键也成为聚簇索引(InnoDB引擎),顾名思义有串数据聚在索引下,
而这数据串就是索引所在的整行数据,存储结构如上述主键数据结构
辅助索引
二级索引也称辅助索引、普通索引,叶子节点存放主键值,数据结构如上辅助索引
复合索引
上述两种索引都是单个列充当索引,这个顾名思义为多列组成的索引,
遵循最左前缀原则,即(col1,col2,col3),以下查询组合都触发该复合索引,
(col1),(col1,col2),(col1,col3),(col1,col2,col3),
而以下不触发(col2),(col3),(col2,col3)
覆盖索引
这个只是一种优化手段,只在复合索引中体现,例如我要根据col1查出col2,若是只建立了col1索引,
则需要从col1索引树找到符合条件的主键值,返回到主键树找到整行数据,再取出col2数据(该过程称为回表)
若是建立复合索引(col1,col2), 在复合索引树(col1,col2) 当匹配到复合col1的
节点就能得到col2的值,而无需回表获取整行数据,从而提高查询速度
拓展
MyISAM,一个表的数据怎么存放
xx表,xx.frm 记录表结构, xx.myi, 存放索引树, xx.myd 存放表数据
InnoDB,一个表的数据怎么存放
xx表,xx.frm 记录表结构, xx.Idb 存放索引树(由于主键索引叶子存放整行数据故,无需另外的存放数据文件)