ITPub博客

首页 > 数据库 > MySQL > Mysql InnoDB的表设计-主键设计

Mysql InnoDB的表设计-主键设计

原创 MySQL 作者:gfj1234 时间:2015-01-23 09:40:22 0 删除 编辑
 
最近看了一些Mysql的资料,重新温故了一下以前理解的一些知识。有些知识需要反复理解,才能真正掌握。以下我会慢慢总结一些自己理解的知识,分享给大家。这些知识其实很多网络上都有,这里仅仅是总结帮助自己更深刻理解 

1.   Mysql  InnoDB的表设计-主键设计

(1)这里我们给出Mysql InnoDB的主键设计原则:

每个表均需要有一个主键,原则上主键是一个整型的自增量。

(2) 原理

    给出这样的设计原则,主要是InnoDB的表结构有关。在Mysql的InnoDB存储引擎中,表的数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。 所以Mysql的InnoDB存储引擎表一定需要主键,如果不显示定义主键,Mysql  会隐式定义主键。 

   如果选择一个非自增量的值作为索引,那么这个值的INSERT就很有可能导致索引的分裂(这个根据索引的原理理解),那么INSERT的效率势必会降低;而如果使用自增量,那么由于数据是增加的,整个数据也就写在了数据文件的后端,不会导致索引分裂。 由于这个原理,所以上述给出了Mysql InnoDB存储引擎的设计原则。

    那么,Oracle中存在这个问题吗?一般来说,我们现在使用的Oracle的表均是堆结构的表,它的数据是无序存放的,所以不存在Mysql InnoDB存储引擎这样的问题。Oracle的堆表的设计也正是为了Insert的效率而考虑。

    不过,Oracle数据库中也有类似Innodb存储引擎这样的表,这种表的类型我们称为索引组织表,这种类型的表中要求必须要有主键(Oracle的表是可以没有主键的)。这种表设计主要是为了某些特殊场景中的IO优化使用。例如:仅仅通过主键访问数据,或者说希望把相邻数据存放在一起减少io的读取量,那么就非常适用使用这种表。Oracle在索引组织表中的一个经典案例如下:

    有一张股票信息表,按照时间date和股票代码ticker为主键,每天都需要导入最新的股票价格,但是查询的时侯总是查询出某个股票某段时间的股票价格,此时该表就适合IOT。IOT表保证了同一支股票不同时间是存储在相同位置上的,此时按照股票和时间段访问数据,就可以减小I/O操作

(3)Mysql 自增量主键存在问题

   上述描述了InnoDB存储引擎的主键的原理和设计原则。但是在现实的场景下,我们往往不能完全满足设计要求。我们可以把表的主键设计为自增量,但是由于在7*24的环境中,我们通常会配置Mysql的主主环境,为了避免主键的冲突,通常我们会设置步长。也就是说主1上的主键可能是1,3,5,7……,而主2上的主键可能是2,4,6,8……,这样的数据做复制,那么我们依然是不能完全避免表的索引分裂的问题。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/617982/viewspace-1411685/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: mysql集群
请登录后发表评论 登录
全部评论

注册时间:2010-05-18

  • 博文量
    44
  • 访问量
    66189