mysql什么分表?以及我什么知道该去哪个表取数据?
@大尨,@无名啊,我们再来谈一下扩展的问题。以2的N次方作为分表数量,以后就能较为轻松的扩展。
比如,最开始2个表,如果未来想变成4个,那只需要先重命名表:
表0 -> 表0
表1 -> 表2
然后再创建表1
和表3
,再把表0
中的一半数据移到表1
,表2
中的一半数据移到表3
,扩展就完成了。扩展工作简单到只需要修改一个变量(表的数量),再执行几行SQL语句。
这样的扩展可以不断进行下去,如果单个MySQL实例性能不满足需求,就把一半的表扩展到另一个MySQL实例,直到满足性能需求为止。
当然如果使用的是MySQL集群,还有更简单的选择,直接向集群添加实例即可。这样一来,不同的表就会交由集群中不同的实例来处理,因为各个表相互独立,不会遇到明显的边际效应递减,表的数量增加一倍,性能也会提升近一倍。
下面很多参考了这篇文章
(我没查到 Dynamic 的。。据说和 Compact 很像)
类型 | 变长字段长度列表 | NULL标志位 | 记录头信息 | rowid | 事务ID | 回滚指针 | 列1 | 列2 | … |
---|---|---|---|---|---|---|---|---|---|
字节数 | 每个字段占 1~4 B | 每个字段占 1 bit,至少 1 B | 5 | 6(若无主键) | 6 | 7 |
(我也没查到 非叶子结点 长啥样,逼乎文章说是主键字段1, 主键字段2, ..., 行记录所在页号(4 B)
)
1.1
可知,假设 页头+页目录+页尾 占用 1KB,剩余15KB可用作存储1.3
所述长度字段 | id | uid | type | crc | wxid | appid | extend | ctime |
---|---|---|---|---|---|---|---|---|
实际平均占用字节数 | 4 | 4 | 2 | 4 | 20 | 20 | ? | 4 |
最多能存:
@大尨 说 300W 就会性能下降,我假设为层数变高导致,代入上式求得extend
长度约为 1266
(后来想到,随机插入会导致页分裂,假设每页只能用一半,那 extend
实际会更长)
CREATE TABLE `app_ulogsxx` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` int UNSIGNED NOT NULL,
`type` int UNSIGNED NOT NULL,
`wxid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`appid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`extend` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`ctime` int NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`,`type`,`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `app_ulogsxx` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` int UNSIGNED NOT NULL,
`type` int UNSIGNED NOT NULL,
`wxid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`appid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`extend` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`ctime` int NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `type` (`type`),
KEY `wxid` (`wxid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@老虎会游泳,那为啥还要将
wxid
作为索引之一?白白浪费空间我关注点还是“增大单表3层B+树最大容量”上