« 上一篇下一篇 »

数据存储优化

如果你已经了解InnoDB存储引擎的物理结构,那么我们可以通过分析InnoDB的物理文件结构寻找可以优化的线索。

    一、理解InnoDB数据及索引文件存储格式

    InnoDB存储引擎的数据存放在相同的文件中,这一点和MySQL默认存储引擎MyISAM的区别较大,后者分别存放于独立的文件。除此之外InnoDB的数据存放格式也比较独特,每个InnoDB表都会将主键以聚簇索引的形式创建。所有的数据都以主键升序排列在物理磁盘上面,所有主键查询并且以主键排序的查询效率也会非常高。

    由于主键是聚簇索引的,InnoDB基于主键的查询效率非常高。如果在创建一个InnoDB存储引擎表时病没有创建主键,那么InnoDB会尝试创建于表上的其他索引。如果存在由单个not null属性列的唯一索引,InnoDB则会选择该索引作为聚簇索引。如果没有任何单个not null属性列的唯一索引,InnoDB会自动生成一个隐藏的内部列,该列会在每行数据上占用6个字节的存储长度。所以,实质上每个InnoDB表都至少会有一个索引存在。

    在InnoDB上面除了聚簇索引之外的索引,都被称为secondary index,每个secondary index上都含有聚簇索引的索引键信息,方便通过其他索引查找数据的时候能够更快地定位数据位置。

    当然,聚簇索引并不是只有优点,没有任何缺点,要不然其他数据库早就大力推广了。聚簇索引的最大问题就是索引键被更新造成的成本并不只是索引数据可能会移动,而是相关的所有记录数据都需要移动。所以,为了性能考虑,尽可能不要更新InnoDB的主键值。

    Page

    InnoDB存储引擎中的所有数据,不论是表还是索引,或是存储引擎自己的各种结构,都以page作为最小物理单位来存放,每个page默认大小为16KB。

    Extent

    Extent是一个由多个连续page组成的一个物理存储单位。一般来说,每个extent为64个page。

    Segment

    Segment在InnoDB存储引擎中实际上也代表“files”的意思,每个segment由一个或多个extent组成,而且每个segment都存放同一种数据。一般来说,每个表数据会存放于一个单独的segment中,实际上也就是每个聚簇索引会存放于一个单独的segment中。

« 上一篇下一篇 »