学习笔记:InnoDB表空间和索引结构

来源:互联网 发布:苹果专用赚钱软件2016 编辑:程序博客网 时间:2024/05/14 17:28

表空间:
MySQL把数据库中表结构的定义信息保存到数据库目录的.frm文件中。
在InnoDB中数据库中存储的数据及索引实际是存放在表空间里的(tablespace)。(通过innodb_data_file_path可以查看配制表空间文件)可以用多个文件组成一个表空间,若这多个文件位于不同的磁盘上,则可以对性能带来一定程度的提升。如果表空间文件用完,该文件可以自动增长。该文件默认为./data/ibdata1。我们可以将每个基于InnoDB存储引擎的表单独产生一个表空间,文件名为:表

名.ibd(./data/databasename/*.ibd),这样就不用将所有数据都存放于默认的表空间中.
需要注意的是,这些单独的表空间文件仅存储该表的数据、索引和插入缓冲等信息,其余信息还是存放在默认的表空间中.
当MySQL移除表或数据库,它不得不删除.frm文件和InnoDB数据词典内的相应条目。这就是为什么当使用InnoDB时你不能在数据库之间通过简单地移动.frm文件来移动表。

 

索引结构:
每个InnoDB表都有一个叫聚集索引(clustered index)的特殊索引。

.如果表定义了主键,主键就是聚集索引。
.如果没有为表定义主键,MySQL就选择第一个不可为空的唯一索引(UNIQUE)作为主键,并且InnoDB把它作为聚集索引。
.如果表没有主键,也没有合适的唯一索引,InnoDB内部会产生一个隐藏的聚集索引:RowID。RowID是一个6字节的域,它在新行被插入的时候单调增加。因此被RowID排序的行是物理地按照插入顺序排序的。
由于聚集索引和行数据存放一起(在同一个数据页中),所以利用聚集索引访问数据行时,非常的快。
如果表是巨大的,当对于那些索引与数据放在不同数据页上的方案,聚集索引构架通常更节约磁盘I/O。(比如,MyISAM用一个文件存放数据,另外一个文件存放索引)。
聚集索引,并没有一个单独的索引树来存储,因此在磁盘上,聚集索引树的叶节点上就是数据。所以如果要访问所有的聚集索引的话,就会导致多读取了所有的数据。非聚集(secondary index)索引,单独存于另一棵树。 而且非聚集索引的叶节点上是聚集索引的字段值,当需要取数据行时,根据这个值再去聚集索引树上取。如果不需要数据行,则读取的数据明显就要少得多。
所以,如果聚集索引比较长,第二索引就会使用更多空间,因此最好使用一个比较短的主键。

 

 

参考博文:
http://dinglin.javaeye.com/blog/804657
http://www.javaeye.com/wiki/hzbook/2906-MySQL-InnoDB#3408
http://ourmysql.com/archives/817

原创粉丝点击