MySQL对于表的拆分有两种方式,一种是垂直分表(Vertical partitioning),另一种是水平分表(Horizontal partitioning)。垂直分表是将一个表拆分成多个表,每个表只包含某个列或者列的子集,旨在将列相互关联性较小的列分离出来。而水平分表则是将一个表拆分成多个表,每个表包含相同的列,但是数据行不同,旨在将数据行分离出来。
-- 创建原始表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
假设大家有一个名为user的表,包含id、name、email和phone等列,现有两种方式对其进行分表。
垂直分表
-- 创建垂直分表1,包含id和name列 CREATE TABLE `user1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建垂直分表2,包含id和email列 CREATE TABLE `user2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建垂直分表3,包含id和phone列 CREATE TABLE `user3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在垂直分表中,大家将原始表的列分离成不同的表中,每个表只包含一个或多个列,这样做的好处是可以减少表的列数,提高对列的访问效率。
水平分表
-- 创建水平分表1,包含id在1到100之间的数据 CREATE TABLE `user1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建水平分表2,包含id在101到200之间的数据 CREATE TABLE `user2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 创建水平分表3,包含id在201到300之间的数据 CREATE TABLE `user3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在水平分表中,大家将原始表的数据行分离到不同的表中,每个表包含相同的列,但数据行不同,这样做的好处是可以分散数据存储,提高管理效率和查询速度。
总之,MySQL的表分表可以充分利用数据库优势,提高大数据处理效率,同时也需要在实际应用中根据具体情况选择合适的分表方式。