故事从好多年前说起。
想必大家也听说过数据库单表建议最大2kw条数据这个说法。如果超过了,性能就会下降得比较厉害。
巧了。
我也听说过。
但我不接受它的建议,硬是单表装了1亿条数据。
这时候,我们组里新来的实习生看到了之后,天真无邪的问我:"单表不是建议最大两千万吗?为什么这个表都放了1个亿还不分库分表"?
我能说我是因为懒吗?我当初设计时哪里想到这表竟然能涨这么快。。。
我不能。
说了等于承认自己是开发组里的毒瘤,虽然我确实是,但我不能承认。
我如坐针毡,如芒刺背,如鲠在喉。
开始了一波骚操作。
"我这么做是有道理的"
"虽然这个表很大,但你有没有发现它查询其实还是很快"
"这个2kw是个建议值,我们要来看下这个2kw是怎么来的"
数据库单表行数最大多大?
我们先看下单表行数理论最大值是多少。
建表的SQL是这么写的,
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',
`age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=100037 DEFAULT CHARSET=utf8;
复制代码
其中id就是主键。主键本身唯一,也就是说主键的大小可以限制表的上限。
如果主键声明为int
大小,也就是32位,那么能支持2^32-1,也就是21个亿左右。
如果是bigint
,那就是2^64-1,但这个数字太大,一般还没到这个限制之前,磁盘先受不了。
搞离谱点。
如果我把主键声明为 tinyint
,一个字节,8位,最大2^8-1,也就是255
。
CREATE TABLE `user` (
`id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',
`age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
复制代码
如果我想插入一个id=256的数据,那就会报错。
mysql> INSERT INTO `