高性能MySQL实战(一):表结构
CREATE TABLE `service_log` (
`id` bigint(100) NOT NULL AUTO_INCREMENT COMMENT '主键',
`service_type` int(10) DEFAULT NULL COMMENT '接口类型',
`service_name` varchar(30) DEFAULT NULL COMMENT '接口名称',
`service_method` varchar(10) DEFAULT NULL COMMENT '接口方式',
`serial_no` int(10) DEFAULT NULL COMMENT '消息序号',
`service_caller` varchar(15) DEFAULT NULL COMMENT '调用方',
`service_receiver` varchar(15) DEFAULT NULL COMMENT '接收方',
`status` int(3) DEFAULT '10' COMMENT '状态 10-成功 20-异常',
`error_message` varchar(200) DEFAULT NULL COMMENT '异常信息',
`message` text DEFAULT NULL COMMENT '报文内容',
`create_user` varchar(50) DEFAULT NULL COMMENT '创建者',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_user` varchar(50) DEFAULT NULL COMMENT '更新者',
`update_time` datetime NOT NULL COMMENT '更新时间',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '刪除标志',
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='接口调用日志';
慷慨不是明智的
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键'
`message` varchar(1000) DEFAULT NULL COMMENT '报文内容'
MySQL 字符串长度定义的不是字节数,而是字符数。像 UTF-8 这样复杂的字符集可能需要多个字节来存储一个字符。
更小的通常更好
`service_method` char(4) DEFAULT NULL COMMENT '接口方式'
`service_method` tinyint DEFAULT NULL COMMENT '接口方式 1-HTTP 2-TCP'
`service_caller` tinyint DEFAULT NULL COMMENT '调用方',`service_receiver` tinyint DEFAULT NULL COMMENT '接收方'
`service_name` varchar(15) DEFAULT NULL COMMENT '接口名称'
`status` tinyint DEFAULT 10 COMMENT '状态 10-成功 20-异常'
DATETIME 和 TIMESTAMP
MySQL 可以使用 FROM_UNIXTIME() 函数将 UNIX 时间戳转换成日期,使用 UNIX_TIMESTAMP() 函数将日期转换为 UNIX 时间戳。
使用 DATETIME 类型还是使用 TIMESTAMP 类型需要考虑以下问题:
-
存储空间对我们来说重要吗? -
需要支持前后多大时间范围的日期和时间? -
保存的日期数据有精度要求吗? -
是在MySQL中处理时区还是在代码中处理时区?
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`ts` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '时间戳'
如果想要对时间戳进行记录,可以考虑使用 BIGINT 类型,它不会遇到 2038 年的问题。
避免使用 NULL
CREATE TABLE `service_log` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`service_type` smallint NOT NULL DEFAULT -1 COMMENT '接口类型',
`service_name` varchar(30) DEFAULT '' COMMENT '接口名称',
`service_method` tinyint NOT NULL DEFAULT -1 COMMENT '接口方式 1-HTTP 2-TCP',
`serial_no` int DEFAULT -1 COMMENT '消息序号',
`service_caller` tinyint DEFAULT -1 COMMENT '调用方',
`service_receiver` tinyint DEFAULT -1 COMMENT '接收方',
`status` tinyint DEFAULT 10 COMMENT '状态 10-成功 20-异常',
`error_message` varchar(200) DEFAULT '' COMMENT '异常信息',
`message` varchar(1000) DEFAULT '' COMMENT '报文内容',
`create_user` varchar(50) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_user` varchar(50) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`is_delete` tinyint NOT NULL DEFAULT 0 COMMENT '刪除标志',
`ts` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '时间戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='接口调用日志';
TINYINT 表示 Boolean 类型
实数类型
CREATE TABLE `real_number` (
`f1` float(7, 4) NOT NULL,
`f2` float NOT NULL,
`d1` double(7, 4) NOT NULL,
`d2` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='实数';
# 插入数据
INSERT into real_number values (
3.1415926535,
3.1415926535,
3.1415926535,
3.1415926535
);
# 查询结果
select * from real_number;
# 指定 f1 列整数宽度为 4,实际定义允许的最大宽度为 3
INSERT into real_number values (
3210.1415926535,
3.1415926535,
3.1415926535,
3.1415926535
);
# 结果
SQL 错误 [1264] [22001]: Data truncation: Out of range value for column 'f1'
# f2 列插入该值,查看结果
INSERT into real_number values (
3.1415926535,
3210.1415926535,
3.1415926535,
3.1415926535
);
create table `decimal_t` (
`d1` decimal(7, 4) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DECIMAL';
INSERT INTO decimal_t values (3.1415926535);
# 结果值为 3.1416
INSERT INTO decimal_t values (1234.1415926535);
# Data truncation: Out of range value for column 'd1' at row 1
参考资料:
[1]《高性能 MySQL 第四版》:第六章
[2] 11.7 Data Type Storage Requirements
[3] mysql的日期时间类型及精度问题
[4] MySQL之DATETIME与TIMESTAMP的时间精度问题
[5] 11.8 Choosing the Right Type for a Column
[6] 11.1.4 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE
[7] B.3.4.8 Problems with Floating-Point Values
[8]《MySQL 是怎样运行的》:第四章
作者|王奕龙
本文来自博客园,作者:古道轻风,转载请注明原文链接:https://www.cnblogs.com/88223100/p/High_Performance_MySQL_Practice_1_Table_Structure.html