学习mysql技术内幕,简要总结部分内容
B+树索引
B+树索引的本质就是B+树在数据库中的实现。InnoDB存储引擎中,每个页的大小为16KB。因此在数据库中,B+TREE的高度一般都在2-4层,这意味着查找某一键值最多只需要2-4次IO操作,还OK。因为现在一般的磁盘每秒至少有100次IO,2-4的IO意味着查询时间只需0.02-0.04秒。
在MYsql数据库中,索引是在存储引擎层实现的,不同引擎,可能B+TREE索引实现方式不同。
B+TREE索引可分聚集索引和辅助索引(非聚集索引),两者数据结构一样,都是B+TREE,区别在于所存放的数据内容。
InnoDB B+TREE索引
InnoDB 存储引擎是索引组织表,也就是说数据文件本身就是按照B+TREE方式存放数据的。其中,B+TREE的键值为主键,若在建立时没有显式地指定主键,则Innodb存储引擎会自动创建一个6字节的列作为主键。因此在InnoDB存储引擎中,可以将B+TREE索引分为聚集索引和辅助索引。无论如何索引,每个页的大小都为16kb,且不能更改。
聚集索引是根据主键创建的一棵B+TREE,聚集索引的叶子节点存放了表中的所有记录。辅助索引是根据索引键创建的一棵B+TREE,与聚集索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。也就是说,如果通过辅助索引查找数据,那么当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚集索引来得到数据,这种查找方式又被称为书签查找。因为辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般小于聚集索引。若辅助索引是一个包含主键的联合索引,那么并不需要一个额外的列来存放主键值,辅助索引会选择通过联合索引 中的主键进行查找。
MyISAM B+TREE索引
MyISAM存储引擎其实更像一张堆表,所有的行数据都存放于MYD文件中,其B+TREE索引都是辅助索引,存放于MYI文件中。PRIMARY KEY索引和其他索引不同之处在于其必须是唯一的,并且不可为NULL值。其索引页的大小默认为1KB,同样不可调整。因为没有聚集索引,其索引叶子节点存放的键值不是主键值,而是MYD文件中的物理位置。