MySQL学记之索引

索引

描述
索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与
WHERE子句中的条件匹配,并检索这些行的其他列值
数据结构
B Tree的变种,B+ Tree, 左节点<根节点<右节点, 相邻子节点有联系(加快范围查找查询)
父节点为子节点值复制一份维护

B+ Tree

InnoDB主键数据结构

各节点存放索引值,叶子节点额外存放行数据
为什么一定要主键,递增且为整数,为什么叶子节点存放的是整行数据而不同MyISAM一样存放文件行数据指针
1.数据存储引用的B+Tree结构,需要有序,且叶子节点绑定整行数据,所以需要;递增是为了数据在插入是按顺序插入,
不是随意插入导致节点分裂增加树再平衡的可能性,影响性能;整数,所占空间较小,比较方便
2.可以减少磁盘I/O,加快查询速率

 InnoDB主键数据结构

InnoDB辅助索引数据结构

各节点存放着索引值,叶子节点额外存放主键值
为什么不是存放整行数据或存放值而不是和MyISAM一样存放文件行指针
1.减少空间;2.主键值可以根据主键索引树查出,若是已经在树已经在内存中可以减少与磁盘的I/O,
比较符合使用场景;绑定的索引文件指针变更,辅助索引不需要同步变更(个人想法,暂时未找到材料证明)

InnoDB辅助索引数据结构

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 存放索引树(由于主键索引叶子存放整行数据故,无需另外的存放数据文件)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值