Mysqlinnodb为什么使用B+Tree?

“这是我参与更文挑战的第7天,活动详情查看: 更文挑战
Mysql innodb存储结构(B+Tree)

二叉树
缺点:数据量容易单边过长形成链表。

红黑树(本质为平衡二叉树)
缺点:虽然使用旋转方式改变了单边过长,但是数据量大时, 树高度太高不利于查询。

Hash
hash散列算法,无法很好支持范围查询

B-Tree
缺点:虽然每个节点横向扩容控制了高度为3,但是每个节点包含索引列值和行数据,导致存储量小。叶子节点之间没有指针导致范围查找必须每次从根节点查找
特点:索引列不重复

B+Tree(变种的B-Tree)
缺点:如果一行数据按照1kb,索引最多两千多万。(每个节点大下16kb,叶子节点存放了全量数据,非叶子节点冗余了索引列值,并且存储了叶子节点的位置(6B).一个bigint占8B,一个节点大概1170,因为两层所以1170117016=21902400

索引和叶子都是从左往右递增,并且叶子节点之间使用的双向指针。可以有好的支持范围查找。

聚集索引非聚集索引
聚集索引(innodb):

如果没有主动设置主键,就会选一个不包含NULL的第一个唯一索引列作为主键列,并把它用作一个聚集索引。如果没有这样的索引就会使用行号生成一个聚集索引,把它当做主键,这个行号6bytes,自增。可以用select _rowid from table来查询。一共两个文件索引文件和表结构文件

非聚集索引(myisam):

索引文件和数据文件分开存储 (索引文件叶子节点索引列对应着数据文件中数据的地址)一共三个文件 一个索引文件,一个数据文件,一个表结构文件

创建innodb表必须要有主键这是B+Tree特点。

索引类型除了BTREE(其实是B+Tree)结构还可以有hash结构,hash不适合范围查找 
BTREE结构每个叶子节点指向另一个叶子节点,所以对范围查找比较合适