MySQL CREATE TABLE 简单设计模板交流

我们也可以多台机器部署, 设置不同 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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java crm 进销存 模块设计方案

    主页: 记录总进货额、总销售额、总销售利润、30天内销售金额统计总客户数、30天新增客户数图表统计(折线图和柱状图)展示从当前月份开始前12个月销售情况1. 客户资料:记录客户资料…

    数据库 2023年6月6日
    092
  • Spark学习(3) SparkSQL

    什么事sparkSQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用, 它是将Spark…

    数据库 2023年6月16日
    087
  • python爬取博客圆首页文章链接+标题

    新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了。 使用python 爬取博客园首页文章链接和标题。 首先当然是环境了,爬虫在window10…

    数据库 2023年6月11日
    0113
  • 第十六章:接口

    本篇翻译自《Practical Go Lessons》 Chapter 16: Interfaces 1 你将在本章学到什么? 什么是类型接口? 如何定义接口。 “实现…

    数据库 2023年6月6日
    096
  • MySQL常用数据类型及细节

    类型 类型举例 整数类型 TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT 浮点类型 FLOAT、DOUBLE 定点数类型 DECIM…

    数据库 2023年5月24日
    083
  • 常用MySQL语句(持续更新)

    1. 客户端登录 在终端输入 mysql -u[用户名] -p[密码]…

    数据库 2023年6月14日
    078
  • Linux 目录挂载服务

    Linux 服务器挂载文件目录通常有三种形式,手动挂载、自动挂载、Autofs 自动挂载,下面对这三个挂载做一下介绍,接受一下这三个区别以及使用场景: 准备服务器和客户端: ser…

    数据库 2023年6月14日
    0101
  • Arrays.asList()你真的知道怎么用吗?

    发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{…

    数据库 2023年6月11日
    071
  • 设计模式之(4)——单例模式

    定义:单例模式属于创建型模式,该类负责创建自己的对象实例,并且确保只有单个对象被创建,同时该类提供了一种全局访问其唯一实例对象的方式;这个定义中有三个要点:1、单例类只能有一个实例…

    数据库 2023年6月14日
    084
  • 设计模式之(1)——简单工厂模式

    创建型模式:主要用于对象的创建; 结构型模式:用于处理类或者对象的组合; 行为型模式:用于描述类或对象怎样交互和分配职责; ————————————————————————————…

    数据库 2023年6月14日
    096
  • Redis——数据操作(2)

    2022-09-21 (2)hash操作: ①设置多个hash值,(hmset): 查看说明: help hmset hmset person name A age 1 ②获得多个…

    数据库 2023年6月14日
    069
  • kafka详解(一)–kafka是什么及怎么用

    kafka是什么 在回答这个问题之前,我们需要先了解另一个东西–event streaming。 什么是event streaming 我觉得, event strea…

    数据库 2023年6月6日
    080
  • Java的值传递

    1. 形参和实参 实参(实际参数) :用于传递给函数/方法的参数,必须有确定的值。 形参(形式参数) :用于定义函数/方法,接收实参,不需要有确定的值 2. 值传递和引用传递 值传…

    数据库 2023年6月14日
    072
  • JDBC

    JDBC 一、JDBC概述 什么是JDBC? JDBC 是使用 Java 语言操作关系型数据库的一套 API。这套 API 是交由不同的数据库厂商实现的。我们利用 JDBC 编写操…

    数据库 2023年6月14日
    0106
  • 源码 | 为金融场景而生的数据类型:Numeric

    高日耀 资深数据库内核研发毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),…

    数据库 2023年5月24日
    097
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    数据库 2023年6月11日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球