测试的目的和原因 , 公司有很多程序员 , 每个程序员对数据库和表结构都有自己的理解 。而且每个程序员的理解往往是以效率考虑 。既然都是为了效率考虑 , 那么我就来测试一下究竟哪种使用方式效率最高 。
基础原则:程序员 , 不是DB , 所以能用程序逻辑解决的问题 , 就不要使用DB来解决问题 , 除非程序逻辑做不到 , 必须使用数据库来解决的问题 。比如分库分表 , 比如数据唯一性 , 这些能在程序里面完成处理的 , 就不要使用数据库来做 , 这样万一我们程序出问题了 , 数据库还可以兜底 , 如果直接使用数据库来做 , 数据库出问题了 , 那用什么兜底呢???
测试环境:4核心8G内存 普通机械硬盘 , 内网环境(不考虑网速问题)
操作系统:centos linux release 7.9.2009 (Core) 64位
软件:MySQL Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrApper
注意:表的字符设置为 utf8mb4 , 引擎为:InnoDB
如果不是以上情况 , 可能不合适本文测试的内容 。
晚点将会把生成数据的代码发出来 , 分享给想要测试的小伙伴 , 如果感觉有用 , 请关注并转发 , 谢谢!
先说结论:各方面效率最高的是varchar , 居然是 varchar 这。。。。。。难道是因为使用utf8mb4 数据集的原因 , 目前尚未对此进行测试 。
那么表的使用结构就非常明了了 。
【Mysql数据库tinyint,int,bigint,char,varchar究竟用哪个?】主键自增使用 int 就可以了 。其他大部分字段均可以使用 varchar , 单个表格数据量尽量控制在 500万的数据以内 , 500万的数据备份可能就有4G 左右了 。所以不适用bigint , 考虑到数据量大的 , 可以在程序逻辑分表 , 因为是程序员不是DB , 所以尽量少DB操作 , 程序业务逻辑处理 。
电话号码切记不要使用 bigint 原因是因为会有 010 7532 1456 这样的格式 , 那么前面的 0 就不会被记录在数据库 , 那么逻辑需要判断 , 会增加代码量 。比价大小也可以用 varchar 需要在逻辑增加一步判断即可 。
不要使用tinyint 做属性 , 比如 1代表正常 , 2代表待审核 , 3代表审核通过 , 4代表删除
直接使用 varchar 记录 正常 , 待审核 , 审核通过 , 删除
这样 , 当以后增加属性的时候可以直接增加 , 而且当紧急维护的时候可以直接知道属性含义 , 可以直接操作库 。
如果数据库记录的都是 0 1 2 3 4 5 6 7 8 9 这样的数字 , 那么现在看到的是 15 请问代表什么含义 , 那13呢?这样要查代码 , 非常麻烦 。尽量不要给自己找麻烦 。
以下三个字段必须要有 , 时间相关的记录数据变化时间 , 这个由mysql自己控制 , 避免程序逻辑问题 。最后一个是标志位删除 。
CREATE TABLE `XXXXX` (`XXXXX_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'XXXXX的ID',`XXXXX ` varchar(XXX) DEFAULT NULL COMMENT '任意数据',`XXXXX` varchar(XXX) DEFAULT NULL COMMENT '任意数据',… …`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`tb_status` varchar(10) DEFAULT '正常' COMMENT '状态:正常 , 正常;删除 , 删除;',) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
另外 , 不建议做数据库基本的唯一属性 。可以在程序逻辑处理 。原则尽量简化 , 能省就省 。
以下为测试内容 , 用来证明上面的结论的 , 仅作参考 。数据量 400万到1500万+。首先 , 制作表格:
CREATE TABLE `user_test` (`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`char_email` char(200) DEFAULT NULL COMMENT 'char格式的邮箱',`varchar_email` varchar(200) DEFAULT NULL COMMENT 'varchar格式的邮箱',`char_name` char(200) DEFAULT NULL COMMENT 'char格式的名字',`varchar_name` varchar(200) DEFAULT NULL COMMENT 'varchar格式的名字',`varchar_content` varchar(800) DEFAULT NULL COMMENT 'varchar格式的文字内容',`tinyint_type` tinyint(4) DEFAULT NULL COMMENT '用tinyint表示的属性',`char_type` char(20) DEFAULT NULL COMMENT '用char格式表示的属性',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`tb_status` char(50) DEFAULT '正常' COMMENT '状态:正常 , 正常;删除 , 删除;',PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
推荐阅读
- Win下部署多个MySQL数据库实例
- MySQL中常用的15个查询子句
- 15个MySQL常用基本SQL语句
- 数据库迁移有什么技巧?|分享强大的database迁移和同步工具
- 用 MySQL 实现分布式锁,你听过吗?
- 数据库,MySQL,实战,优化,多表联合查询排序问题优化
- MySQL高级SQL语句
- SpringBoot通过JdbcTemplate操作MySQL数据库
- MySQL 团队开发规范,太详细了,建议收藏
- 数据库:评估安全风险4个要点