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,实际定义允许的最大宽度为 3INSERT 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.1416INSERT INTO decimal_t values (1234.1415926535);# Data truncation: Out of range value for column 'd1' at row 1
参考资料:
[1]《高性能 MySQL 第四版》:第六章
[2]11.7Data Type Storage Requirements
[3]mysql的日期时间类型及精度问题
[4]MySQL之DATETIME与TIMESTAMP的时间精度问题
[5]11.8Choosing the Right Type for a Column
[6]11.1.4Floating-Point Types (Approximate Value)- FLOAT, DOUBLE
[7]B.3.4.8Problems with Floating-Point Values
[8]《MySQL 是怎样运行的》:第四章
作者|王奕龙
本文来自博客园,作者:古道轻风,转载请注明原文链接:https://www.cnblogs.com/88223100/p/High_Performance_MySQL_Practice_1_Table_Structure.html