MySQL CREATE TABLE 简单设计模板交流
CREATE TABLE TEMPLATE
CREATE TABLE [table_name] (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '物理主键',
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
[delete_time TIMESTAMP DEFAULT NULL COMMENT '删除时间',] [template] ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT = '模板表';
- 性能更好, unsigned 不涉及 反码和补码 转码消耗
- 表示物理主键更广 [-2^63, 2^63-1] -> [0, 2^64-1]
- mysql 优化会细微好点. select * from * where id < 250; 原先是 select * from * where -2^63 <= id and id < 250; 现在是 select * from * where 0 <= id and id < 250;
- 如果有些语言中没有 unsigned, 需要把关人备注为 signed 使用范围是 [0, 2^63-1]
- 如果 int 也能满足业务, 也可以用 int, 节省 4 字节. 看业务把控和取舍.
- 对于缺少 COMMENT 详细注释的, 推荐把关人 或 DBA 打回修改或拒绝操作
- 修改和补充 COMMENT
-- 修改表注释
ALTER TABLE [table_name] COMMENT '[COMMENT]'; -- 修改字段注释
UPDATE information_schema.COLUMNS SET column_comment = '[COMMENT]'
WHERE TABLE_SCHEMA= '[database_name]'
AND TABLE_NAME='[table_name]' AND COLUMN_NAME= '[column_name]'
分析 3: 为什么用 TIMESTAMP 表示时间 ?
- TIMESTAMP 和 int 一样都是 4 字节. 用它表示时间戳更精简更友好.
- 业务不再关心时间的创建和更新相关业务代码. 省心, 省代码
CREATE TABLE [table_name] (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '物理主键',
update_time BIGINT NOT NULL COMMENT '更新时间',
create_time BIGINT NOT NULL COMMENT '创建时间',
[delete_time BIGINT DEFAULT NULL COMMENT '删除时间',] [template] ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT = '模板表';
MySQL 的 utf8 不是标准的 utf8 unicode 字符集编码.
正规 UTF-8 编码是使用 1-6 字节表示 unicode 字符.
但 MySQL utf8 只使用了 1-3 字节表示一个字符,
CREATE TABLE 小部分场景
AUTO_INCREMENT
倒排索引
同样这个通用名词也很人费解. 如果叫 反向索引 很好理解.
例如我们普通的 id -> data 是(正向)索引, data 中关键 key -> id 是反向(Inverted index)索引
1. InnoDB 中 AUTO_INCREMENT 配置大致说明
- 1.1 innodb_auto_inc_lock_mode=0 (traditional lock mode)
- 获取表锁 (AUTO-INC 锁, 特殊表锁), 语句执行结束后释放, 不需要等事务结束.
- 分配的值也是一个个分配,是连续的. (如果事务 rollback 了这个 auto_increment 值就会浪费掉, 从而造成间隙)
- 1.2 innodb_autoinc_lock_mode=1 (consecutive lock mode, MySQL 8.0 之前默认选项)
- 对于不确定插入数量的语句(例如 INSERT ... SELECT, REPLACE ... SELECT 和 LOAD DATA)
- innodb_autoinc_lock_mode=0 一样获取表锁, 其他的确定数量的语句在执行前先批量获取 id,
- 之后再走的是轻量级互斥锁, 如果其他事务已经获取表锁, 这个时候也需要等待.
- 1.3 innodb_autoinc_lock_mode=2 (interleaved lock mode, MySQL 8.0+ 默认)
- 采用乐观锁, CAS 更新计数器获取. 正常情况性能最好, 因为没有表锁和轻量级互斥锁.
- 但在高并发引发的 高 CPU load 场景会适得其反, 加剧这种 CPU 浪费.
- AUTO_INCREMENT CAS 频率高, 同一个语句操作内部 CAS INC 大概率也会让 id 间隙变大.
2. InnoDB 中 AUTO_INCREMENT 实现大致思路
-- 大致方式通过行级锁(排他锁) MAX(id) -> AUTO_INCREMENT init value
SELECT MAX(ai_col) FROM [table_name] FOR UPDATE;
在 MySQL 8.0 之后, 持久化存储在磁盘. 每次更新会写入 redo log 中, 也会刷入 innodb 引擎系统表中记录下来.
小部分场景
交流 1: 如果考虑分布式场景呢, 高性能领域呢 ?
-- sequece id 生成器表
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 DEFAULT CHARSET=utf8mb4 COMMENT = '古老分布式 id 生成器'; -- 获取 id
DELIMITER $
BEGIN
REPLACE INTO sequece(stub) VALUES ('X');
SELECT LAST_INSERT_ID();
COMMIT
$
-- 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 生成器';
交流 2: 为什么官方推荐 AUTO_INCREMENT 当主键, 而很少见到 UUID 等等?
伪共享 (false sharing) 的非标准定义为:
缓存系统中是以缓存行 (cache line) 为单位存储的. 当多线程修改互相独立的变量时,
如果这些变量共享同一个缓存行, 就会无意中影响彼此的性能, 这就是伪共享.
后记
MySQL CREATE TABLE 简单设计模板交流的更多相关文章
- MySQL Create Table创建表
表的创建命令需要: 表的名称 字段名称 定义每个字段(类型.长度等) 语法 下面是通用的SQL语法用来创建MySQL表: CREATE TABLE table_name (column_name co ...
- mysql create table - data_type length -- clwu
mysql create table 时,有时需要指定 data_type length http://dev.mysql.com/doc/refman/5.5/en/create-table.ht ...
- MySQL create table 语法
MySQL中create table语句的基本语法是: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definitio ...
- mysql create table 语法详解
create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...
- mysql CREATE TABLE语句 语法
mysql CREATE TABLE语句 语法 作用:创建数据库中的表. 大理石量具系列 语法:CREATE TABLE 表名称 (列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,.... ...
- MySQL create table语法详解
前面在查建表时key和index的区别时,发现建表语句包含了太多信息,于是完整看看官方手册的这一小节. 该文章根据MySQL 5.7的手册作笔记,而MySQL 8.0该节地址如下: https://d ...
- MySQL create table as与create table like对照
在MySQL数据库中,关于表的克隆有多种方式,比方我们能够使用create table ..as .. .也能够使用create table .. like ..方式. 然而这2种不同的方 ...
- MySQL create table as与create table like对比
a.create table like方式会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据b.create table as 方式会部分克隆表结 ...
- MySQL Create table as / Create table like
a.create table like方式会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据 b.create table as 方式会部分克隆表 ...
随机推荐
- 直播流媒体fms
第一步 下载 Flash Media Server 4.5 安装教程网上很多 也很简单 我的密码记录 用户admin 密码admin23456 第二步 直接 下载 直播测试工具 FlashMe ...
- EPF:一种基于进化、协议感知和覆盖率引导的网络协议模糊测试框架
本文系原创,转载请说明出处:from 信安科研人 目录 实验 工具的安装 1.安装AFL++ 2.安装epf 对IEC104协议库进行fuzz 实验准备 使用AFL++中的编译器插桩 开始fuzz 原 ...
- WebGPU 中的缓冲映射机制
1. 什么是缓冲映射 就不给定义了,直接简单的说,映射(Mapping)后的某块显存,就能被 CPU 访问. 三大图形 API(D3D12.Vulkan.Metal)的 Buffer(指显存)映射后, ...
- nginx实现后端tomcat的负载均衡调度
一.编译安装nginx 请跳转查阅:编译安装nginx 二.tomcat的二进制安装 请跳转查阅:二进制安装tomcat 三.配置nginx代理 # cat /apps/nginx/conf/ngin ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「HEOI/TJOI 2016」「洛谷 P2824」排序
\(\mathcal{Description}\) Link. 给定排列 \(\{p_n\}\) 和 \(m\) 次局部排序操作,求操作完成后第 \(q\) 位的值. \(n,m\le10 ...
- .NET官方封装的Win32API类库
大部分朋友在使用C#.NET调用Win32API时都不清楚API函数的声明,要么就是抄网上的代码,但是总会遇到各种各样奇奇怪怪难以解决的问题,打算自己封装又发现工作量实在太大. 其实完全没有必要自己动 ...
- 花里胡哨之自定义linux终端前缀显示
文章目录 1.先看默认的linux终端前缀 2.查看默认的终端前缀变量 3.符号所代表的意义 4.修改PS1变量,达成自定义效果 4.1.只显示主机名和完整目录 4.2.给他点颜色看看 5.谢幕 1. ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...
- python.36的特性新定义初学者必看课程
一.Python3.6新特性 1.新的格局化字符串办法 <p "="">新的格局化字符串办法,即在一般字符串前增加 f 或 F 前缀,其效果相似于str.fo ...