但是如果业务逻辑OK的情况下 , 单表数据量控制在 500万以内更加合适 。
以此表为例子 , 当数据在300万的时候 , 备份的sql文件是2G左右大小 。500万+ 的数据库备份文件会更大一些 , 这样的话 , 还要考虑备份的时间和效率问题 。切记一定要做读写分离 , 并且在从库上做数据备份操作 。
结论:tinyint 和 char 的效率非常接近 , 但是在维护和逻辑理解上 , char更加直观 , 建议使用char 又因为 varchar 的查询效率高于 char 所以 , 都用 varchar吧 。
使用bigint , tinyint 还是使用char , varchar ?测试表结构:
CREATE TABLE `test_big_char` (`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '测试的ID',`bigint_num` bigint(20) DEFAULT NULL COMMENT 'bigint数据',`char_num` char(20) DEFAULT NULL COMMENT 'char数据',`varchar_num` varchar(20) DEFAULT NULL COMMENT 'varchar数据',`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 AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
select count(*) from test_big_char;
耗时1.3秒 , 400万数据量级
文章插图
查询
根据主键进行简单查询 , 速度非常快 。400万数据量级
文章插图
查询
select * from test_big_char where bigint_num = 6616351006811;
耗时:2.4秒 , 400万数据量级增加索引之后 , 耗时:0.01秒
切换其他值查询 , 耗时:0.00秒 , 带索引 , 400万数据量级
select * from test_big_char where char_num = '6616351006811';
耗时:2.87秒 , 400万数据量级增加索引之后 , 耗时:0.00秒
select * from test_big_char where varchar_num = '6616351006811';
耗时:2.28秒 , 400万数据量级增加索引之后 , 耗时:0.00秒
切换其他值进行查询 , 耗时:0.00秒 , 带索引 , 400万数据量级
文章插图
查询
第二次查询情况
文章插图
查询
第三次查询 , 因为 char 查询最慢 , 所以之做 bigint 和 varchar 的比较:
文章插图
查询
在没有索引的情况下 , varchar和bigint 的查询效率几乎相同 , 400万数据量级 。
增加索引之后:
文章插图
增加索引
那么接下来测试 大于 , 小于 的各种情况 , 实际测试 char和varchar 得到的结果不准确 , 需要加其他限定条件 , 但就数据库查询而言 , varchar的查询效率最高 。
文章插图
比较
为了避免执行先后顺序问题 , 再执行一次顺序不一样的 。
文章插图
结果
还测试了许多其他的内容 , 就不再一一记录了 , 感兴趣可以自己操作一遍 。
晚点将会把生成数据的代码发出来 , 分享给想要测试的小伙伴 , 如果感觉有用 , 请关注并转发 , 谢谢!
推荐阅读
- Win下部署多个MySQL数据库实例
- MySQL中常用的15个查询子句
- 15个MySQL常用基本SQL语句
- 数据库迁移有什么技巧?|分享强大的database迁移和同步工具
- 用 MySQL 实现分布式锁,你听过吗?
- 数据库,MySQL,实战,优化,多表联合查询排序问题优化
- MySQL高级SQL语句
- SpringBoot通过JdbcTemplate操作MySQL数据库
- MySQL 团队开发规范,太详细了,建议收藏
- 数据库:评估安全风险4个要点