最近看了一些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/
,如需转载,请注明出处,否则将追究法律责任。