Mysql之索引分享之索引分享
索引本质索引本质
官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构
本质:索引是数据结构本质:索引是数据结构
innodb索引的种类索引的种类
B-Tree 索引索引
B+树成因:树成因:
我们知道,每一种数据结构的出现都是为了解决特定的问题,那么B+树的出现是为了解决什么问题,那就是:每次查找数据
时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。在理解B+树结构之前,先提一下计算机的局部性原理:当计
算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页
有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索
引的数据结构设计非常有帮助。
B+树结构树结构
B+树的定义可以参见B+树,我们先看一下B+树的结构:
浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包
含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘
块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实
的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
b+树的查找过程树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在
17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地
址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,
发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,
如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百
万次的IO,显然成本非常非常高。
b+树性质树性质
1.通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则
有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个
数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引
字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节
点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。
疑问1:
可以放在里面讲 HASH 索引
只有Memory引擎支持,使用场景简单。
疑问2:
我们都知道一个表的数据不能存储太多数据,否则会造成查询性能下降,根据上面B+树结构,我们可以大体算算出一个
MySQL的一个表大概存储多少行记录会导致性能下降。
Full-text (全文索引全文索引)
InnoDB从MYSQL5.6版本开始支持
高性能索引策略高性能索引策略
主键索引主键索引
https://www.kancloud.cn/kancloud/theory-of-mysql-index/41850