我们也可以多台机器部署, 设置不同 AUTO_INCREMENT step, 让每个 sequece 产生不同号码.
例如部署 step = 2 个服务结点, 并行获取数据.
一个 from 1, 3, 5, 7, 9 …
一个 from 2, 4, 6, 8, .. .
详细部署操作指导
-- step 标识增长步长, 也标识分布式机器数
show global variables like 'auto_increment%'
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
-- auto_increment_increment 全局步长
-- auto_increment_offset 自增起始值
-- 设定自增步长
-- set session 设置当前会话链接, set global 设置当前 ID 机器
set global auto_increment_increment=step
for i : [0, step)
CREATE TABLE sequece (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '物理主键, 自增 id',
stub char(1) NOT NULL DEFAULT '' COMMENT '打桩靶子',
UNIQUE KEY unique_key_stub (stub)
) ENGINE=InnoDB AUTO_INCREMENT = [offset + i] DEFAULT CHARSET=utf8mb4 COMMENT = '古老分布式 id 生成器';
这种古老 MySQL 分布式 ID 生成器, 方案成熟部署简单. 在高并发领域存在 DB 性能瓶颈.
如果考虑高可用主从架构, 在主服务挂了, 从服务顶上时候存在重复发号可能.
关于 分布式唯一 ID 其它业界解决方案, 后面有机会再聊.
交流 2: 为什么官方推荐 AUTO_INCREMENT 当主键, 而很少见到 UUID 等等?
MySQL InnoDB 引擎默认主键索引是 B+ 线索树索引, 也称为聚簇索引(聚集索引, row key 和 row value 存在连续内存中),
为何叫聚簇索引呢?
在 InnoDB 中, 每个表都会有一个聚簇索引, 在定义了主键(primary key)的情况下,
主键所在的列存储为聚集索引。所谓聚集索引是指数据实际上存储在索引的叶节点上
[En]
The column where the primary key is located is stored as a clustered index. The so-called clustered index means that the data is actually stored on the leaf node of the index
“集群”的意思是把它和相邻的数据紧密地存储在一起。
[En]
The meaning of “clustering” is to store it tightly with adjacent data.
因为同时在两个不同的位置存储行是不值得的,所以一个表只能有一个聚集索引。
[En]
Because it is not worthwhile to store rows in two different locations at the same time, a table can have only one clustered index.
关于 InnoDB 选择哪个列作为聚簇索引存储,大概的优先级为:
如果定义了主键(primary key), 则使用主键;
如果没有定义主键, 则选择第一个不包含 NULL(NOT NULL)的 UNIQUE KEY;
如果也没有, 则会隐式定义一个主键作为聚簇索引.
MySQL 读取磁盘上的数据是一页一页读取的, 如果某条我们要处理的数据在某一页中,
但是这一页其他数据我们都不关心, 这样的请求多了, 性能会急剧下降, 类似于 CPU 的并发杀手 false sharing.
按照 B+ 线索平衡树的原理, AUTO_INCREMENT 的 ID 能保证最新的数据在一页中被读取, 而且减少了 B+ 树分裂翻转.
UUID 等唯一 ID 由于无序, 插入时, B+ 树会不断翻转, 并且最新的数据可能不在同一页.
很可能会出现, 最新一条数据, 和好几年前的数据在同一页.
购物和支付交易的订单、假日促销和抽奖等业务都有这样的使用场景,最近一天和最近一周的访问频率很高。
[En]
Businesses such as orders for shopping and payment transactions, holiday promotions and raffles all have such usage scenarios, which are visited frequently on the most recent day and week.
或者几个月内比较活跃, 而超过一段时间内的数据很少访问.
当然,架构设计是当前业务和未来业务场景之间的权衡。
[En]
Of course, architecture design is a trade-off between current business and future business scenarios.
抛开 MySQL AUTO_INCREMENT 的 ID 分布式和锁性能瑕疵, 在尝试分库分表时候他就变得有点累赘.
Original: https://www.cnblogs.com/life2refuel/p/16036540.html
Author: 喜欢兰花山丘
Title: MySQL CREATE TABLE 简单设计模板交流
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505542/
转载文章受原作者版权保护。转载请注明原作者出处!