思路话语

。Arlen:思想有多远你就能走多远...

简朝阳:MyISAM 索引结构了解 Innodb 索引结构了解 – MyISAM Index Structure – Innodb Index Structure

MyISAM 索引结构了解 – MyISAM Index Structure

 

在此之前曾经写过一篇介绍 “Innodb 索引结构了解 – Innodb Index Structure” 的文章,这次再接着分析一下 MyISAM 存储引擎索引的基本存储结构。

从索引基本的存放数据结构来说,MyISAM 的索引不论是 Primary Key 还是普通 Index,存储结构都基本一样,基本结构都是 Balance Tree (简称为 B-Tree),所有的键值详细信息和行“指针”信息都存放于 B-Tree 的 Leaf Nodes 上面(注意:此处朝阳兄的说法和b-tree的结构相悖,b-tree的非叶节点也是可以有关键字的。再《understanding mysql internal》一书中说到myisam索引的b-tree在非叶节点上也是有着指向数据位置的指针的,采用该书的说法,则myisam的索引可能是b-tree,当然仅凭这一点不能就下结论,因为它也可能是b-tree的变体。原文:Both leaf and nonleaf nodes contain key values and pointers to the record positions
in the datafile. Nonleaf nodes additionally contain pointers to child nodes.)。

(与B+树不同,B树的内部结点和叶结点都有指向记录的指针。)详细的讨论见本文末尾。

这个基本的数据结构和 MySQL 的其他存储引擎如 Innodb 也基本相同。但是,MyISAM 的索引并不像 Innodb 存储引擎那样 Primary Key 和 Secondary Index 中存放的数据存在较大区别。在 MyISAM 存储引擎中,Primary Key 和其他的普通 Index 的主要区别仅仅在于 Primary Key 的索引键需要满足是非空的唯一值而已,另外一个区别其实也是每一个普通索引之间都存在的区别,就是整个索引树的键值排列顺序不太一样。

由于 MyISAM 存储引擎中数据行的存储分为固定长度和动态长度两种,所以在 MyISAM 存储引擎的数据文件中定位一行数据所需要信息也存在两种方式。一种是直接通过行号(row number)来定位固定长度表数据的行,另外一种是通过其他一些相对的文件位置标识信息来定位动态长度表数据的行,这里我们姑且将两种方式统称为RID(Row ID)吧。

下面这张图片展示了 MyISAM 索引的基本存储方式:

 (注:A MyISAM B-tree consists of leaf and nonleaf nodes, or pages. By default, each page
is 1,024 bytes(from:<understanding mysql internal>))

 

 

Innodb 索引结构了解 – Innodb Index Structure

 

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 两种索引的比较

(注: All InnoDB indexes are B-trees where the index records are stored in the leaf pages of the tree. The default size of an index page is 16KB.(from:mysql manual http://dev.mysql.com/doc/refman/5.1/en/innodb-physical-structure.html))

 

关于此文中b-tree,b+tree的讨论:

 

  1. 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.
    这里也没有说到叶结点。不过我没有看过源码,不知是否理解正确。

  2. 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

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

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

 

 

posted on 2010-06-04 10:40  Arlen  阅读(3128)  评论(0编辑  收藏  举报

导航