mysql 中内置了一个 MRG_MYISAM 存储引擎,可以用来水平分表。MRG_MYISAM 引擎要求关联的子表都是 MYISAM 类型。
建立子表
CREATE TABLE `user1` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) NULL,
PRIMARY KEY (`id`)
) ENGINE = MyISAM;
CREATE TABLE `user2` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) NULL,
PRIMARY KEY (`id`)
) ENGINE = MyISAM;
建立大的关联表
CREATE TABLE `alluser` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) NULL,
PRIMARY KEY (`id`)
) ENGINE = MRG_MYISAM UNION = (`user1`,`user2`) INSERT_METHOD=LAST;
正常情况下我们不应该在 alluser 表中进行插入操作,如果确实有需要,可以指定 INSERT_METHOD 参数,INSERT_METHOD 可选的字段有 FIRST
、LAST
,表示从大表插入的时候选择哪一张小表取存储数据。
测试结果
测试插入
INSERT INTO `user1` (`id`,`name`) VALUES(1,'Jake1');
INSERT INTO `user1` (`id`,`name`) VALUES('2','Jake2');
INSERT INTO `user2` (`id`,`name`) VALUES(1,'Bob1');
INSERT INTO `user2` (`id`,`name`) VALUES(1,'Bob2');
操作子表就像操作之前的表一模一样,没有什么区别
测试查询
SELECT * FROM user1;
+----+-------+
| id | name |
+----+-------+
| 1 | Jake1 |
| 2 | Jake2 |
+----+-------+
2 rows in set (0.00 sec)
---
SELECT * FROM user2;
+----+------+
| id | name |
+----+------+
| 1 | Bob1 |
| 2 | Bob2 |
+----+------+
2 rows in set (0.00 sec)
---
SELECT * FROM alluser;
+----+-------+
| id | name |
+----+-------+
| 1 | Jake1 |
| 2 | Jake2 |
| 1 | Bob1 |
| 2 | Bob2 |
+----+-------+
4 rows in set (0.00 sec)
查询子表就像操作之前的表一模一样,查询总表的时候是可以查询出两个子表的数据。
并且这里是不能使用自增id的,应该在应用层生成一个全局唯一的 id。对于数据库的增加还是建议在应用层选择插入的哪一张表,但是对于删改查的时候那就非常方便了,直接操作 alluser 表即可
网友评论