目录
一:Mysql自增排序
在日常的开发中,大都数的时候我们熟悉使用了Mysql的自增主键。但是这种方案使用在单体单机应用下,一旦出现集群或者分布式环境就会出现主键不唯一的问题。
下面我们将从Mysql的自增主键说起以及解决分布式主键生成策略。
二:Mysql的主键排序
谈到主键排序就不得不提到引擎,因为在Mysql的之间排序是由引擎来决定的。在Mysql中,我们常用的数据库引擎有2个:MyISAM和InnoDB,在大多数的开发的场景我们使用的是后者。我大概记得应该在Mysql5.4之后,Mysql的默认引擎由MyISAM变成了InnoDB。
下面我们简单比较一下这2个引擎的区别:
(1)InnoDb:支持事物,行级锁,以及全文索引。
(2)MyISAM:大数据读取快(因为MysISAM会存储select count(*)),不支持事务杭锁等。
下面再来简单比较一下2个引擎读取数据的顺序
(1)InnoDB:按照主键进行排序(因为主键实则就是一种索引规则)
(2)MyISAM:按照堆表结构方式排序
ps:一旦MyISAM出现增删改时,顺序就会乱
下面我们再来简单标记一下2个引擎的使用场景
(1)InnoDB:大多数的开发场景,目前我们使用的MYSQL都是使用的默认引擎
(2)MyISAM:一些不需要事物支出的,比如单纯的订单,操作日志等
下面我们来简单比较一下2个引擎排序的原理
(1) InnoDB:聚簇索引表
聚簇索引表,表数据和主键一期存储,一级节点存储行数据,二级节点存储主键值。因此,我们常常在建表就指定一个默
认。大大提高了I/O密集型应用的性能。
(2)MyISAM:堆表结构
在默认的情况下,不做修改等,会按照插入的顺序。
三.分布式主键策略
不用问这里的策略针对分布式,针对InnoDB引擎。
1.集群或者分布式下数据库自增主键带来的风险
在数据库集群或者分布式数据库情况下,依照Mysql自增主键会带来主键不唯一的问题。比如A,B俩表做了集群部署,数据随机插入2个表,查询时就会出现2个表一定会出现同样主键问题。
2.分布式主键方向
结合翻阅的资料,目前解决分布式主键有2个方向的:应用层面和数据库层面。
应用层面:由应用程序作为生成主键的主要解决方案。一般参考UUID和时间戳作为唯一方向。
数据库层面:由存储数据库本身或者全局数据库比如Redis作为依据。