前言
这次想写的系列文跟 Partition Table 有关,相信不管是用 MSSQL, MySQL 或是其他的资料库都有听过这个概念,不过我不会特别去说明该如何建立,相信网路上已经有很多建立的方式,我这里会针对实务上遇到的几个问题,以及如何解决的来做分享,大概会有以下几个主题
用途在既有的 TABLE 上建立 partitionpartition 数量与效能的影响partition by 日期的方式用途
很多人第一次接触到 partition Table 的情况是,随着日子过去,资料量越来越大,搜寻资料的速度越来越慢,开始想找一些方式把资料分散,此时可能会查到几点
分表:
实体分表,例如把身分证开头 A 的放在一张表,身分证开头 F 的放在另一张表缺点是每张表的名称都不一样,还要依据不同表名称下SQL语法,对应到正确的分表上。而且如果要捞出所有的人,所有表都要 UNION起来。分区(partition):
实际上看到的还是同一个表,对于应用层也比较单纯,且不需要修改但是物理上可以拆分在不同的位置举个简单的例子,如下图1绿色框框的 tb1 是没有建 partition 的 TABLE ,可以看到只有一个 ibd 档案
红色框框的 tb2 是有建两个 partition 的 TABLE,可以看到有两个 ibd 档案
图1
★ 建上面两个 TABLE 的语法如下
CREATE TABLE `tb1` ( `trans_id` int NOT NULL AUTO_INCREMENT, `lang_id` int NOT NULL, `lang` char(5) NOT NULL, `trans_text` text, PRIMARY KEY (`trans_id`,`lang_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `tb2` ( `trans_id` int NOT NULL AUTO_INCREMENT, `lang_id` int NOT NULL, `lang` char(5) NOT NULL, `trans_text` text, PRIMARY KEY (`trans_id`,`lang_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8PARTITION BY LIST (`lang_id`)( PARTITION pt1 VALUES IN (1) ENGINE = InnoDB, PARTITION pt2 VALUES IN (2) ENGINE = InnoDB) ;
小结
这里的 partition (分区) 就是本次主题想讨论的,也希望透过接下来的系列分享,让大家对于 partition 上有更进一步的认识。
资料库知识相当广泛,文中若有不正确的地方,也烦请各位大神不吝指教,谢谢