search 2013 adfgs
作者:Sky.Jian | 可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明
链接:http://isky000.com/database/innodb_index_structure_basic | del.icio.us | Twitter it

Innodb 作为 MySQL 中使用最为广泛的 事务型存储引擎,不仅在事务实现数据版本控制方面和其他存储引擎有一定的区别,其数据结构也是以非常有特点的方式存储的。

每个Innodb表的数据其实可以说就是以一个树型(B-Tree)结构存储的,表的数据和主键(Primary Key)共同组成了一个索引结构,也就是我们常说的Innodb的Clustered Primary Key。在这个Clustered Primary Key中,Leaf Nodes其实就是实际的表记录,我们常规理解上的索引信息全部在Branch Nodes上面。

除了Clustered Primary Key之外的其他所有索引在Innodb中被称为Secondary Index。Secondary Index就和普通的B-Tree索引差不多了,只不过在Secondary Index的所有Leaf Nodes上面同时包含了所指向数据记录的主键信息,而不是直接指向数据记录的位置信息。

所以,在 Innodb 中,如果主键值占用存储空间较大的话,会直接影响整个存储 Innodb 表所需要的物理空间,同时也会直接影响到 Innodb 的查询性能。

下面是画的一张 Innodb 索引基本结构图,包括 Primary Key 和 Secondary Index 两种索引的比较。

, , ,

已经有20个回复

  1. 朝阳 Says @ 08-11-18 5:42 pm

    用OpenOffice的Draw画的图,感觉效果不咋滴,唉…

  2. xlambda Says @ 09-05-8 4:49 pm

    根据wikipedia的说明,B-tree是所有的结点都存放数据,而不仅仅是叶结点的。http://en.wikipedia.org/wiki/B-tree#Node_structures
    而且这个页面里:http://www.innodb.com/doc/innodb_plugin-1.0/innodb-row-format.html 也有说到:The essential idea is that the nodes of the B-tree contain, for each primary key value (whether user-specified or generated or chosen by the system), the values of the remaining columns of the row as well as the key.
    这里也没有说到叶结点。不过我没有看过源码,不知是否理解正确。

  3. xlambda Says @ 09-05-8 5:51 pm

    high performance mysql (http://books.google.com/books?id=BL0NNoFPuAQC&pg=PA97&lpg=PA97&dq=innodb+b-tree+leaf+node+store+data&source=bl&ots=CNTKAwsIaU&sig=4OpA0xAfiQfT9mzJDVyJyNYw_BQ&hl=en&ei=xfMDSo3sEpzI6wOYkIWaAw&sa=X&oi=book_result&ct=result&resnum=1#PPA96,M1) 第二版有说到,原来Innodb用的是B+ tree

  4. 朝阳 Says @ 09-05-9 4:16 pm

    @xlambda
    这里的B-Tree索引只是数据库索引结构中索引类型的统称,不要照搬数据结构的理论。实际上,各个数据库所实现的B-Tree都是有其自身特点的,而且实际上都可以称之为B+ Tree。

  5. bessiefu Says @ 09-07-6 8:34 am

    疑问:在这个Clustered Primary Key中,Leaf Nodes其实就是实际的表记录。那这样讲的话,表的索引文件会比表文件还大?

  6. 朝阳 Says @ 09-07-6 9:35 am

    @bessiefu
    Innodb 表本身的存储结构就是一个基于主键索引的大的索引树结构。
    你可以测试一下,当一个 Innodb 表仅仅只有一个主键索引的时候,通过 show table status 所看到的输出信息,Index_length是0,只有Data_length信息。

  7. bessiefu Says @ 09-07-6 4:02 pm

    明白了,非常感谢 :)

  8. T.H Says @ 13-11-19 10:20 pm

    有个困惑想请教下朝阳兄,如果是多列组成的联合索引这个B+Tree是什么结构?是所有列的数据的集合在一颗B+Tree大排列,还是每个列单独一个B+Tree?

Trackbacks & Pingbacks

看完了要说点啥么?