学习笔记:InnoDB表空间和索引结构
2011-03-08 15:08
197 查看
表空间:
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
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
相关文章推荐
- 学习笔记:InnoDB表和索引结构
- oracle学习笔记 存储结构_表空间
- 学习笔记-ArcSDE中空间索引
- 数据结构与算法学习笔记——算法的时间和空间复杂度
- Laravel5.1 学习笔记1, 目录结构和命名空间(待修)
- Innodb索引和锁的学习笔记
- Innodb索引和锁的学习笔记
- 学习笔记:InnoDB存储结构及多版本实现
- 【学习笔记】mysql索引原理之InnoDB
- [iPhone学习笔记五]iPhone程序包结构
- C++ Primer 学习笔记_105_特殊工具与技术 --联合:节省空间的类
- 机器学习&数据挖掘笔记_24(PGM练习八:结构学习)
- 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
- 黑马程序员-IOS学习笔记-C语言基础选择结构
- 5Java学习笔记之数据结构——字符串String
- U-boot目录结构学习笔记
- phalcon学习笔记-----命名空间的使用
- [学习笔记]套接字地址结构
- <学习html>第五天笔记-表格table(创建表格、表格属性、表头标签、表格结构、表格标题标签、合并单元格)
- Oracle10G学习笔记之九表空间的管理