使用MERGE引擎实现MySQL分表,插入数据使用取模方法,查询数据使用MERGE总表。
- 合并的表使用的必须是 MyISAM 引擎
- 表的结构必须一致,包括索引、字段类型、引擎和字符集
简介
Merge 表有点类似于视图。使用 Merge 存储引擎实现 MySQL 分表,这种方法比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况。
这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码。所以使用 Merge 存储引擎实现 MySQL 分表可以避免改代码。
Merge 引擎下每一张表只有一个 MRG 文件。MRG 里面存放着分表的关系,以及插入数据的方式。它就像是一个外壳,或者是连接池,数据存放在分表里面。
merge 合并表的要求:
- 合并的表使用的必须是 MyISAM 引擎
- 表的结构必须一致,包括索引、字段类型、引擎和字符集
对于增删改查,直接操作总表即可。
用户表拆2张表
表一:
1 | DROP table IF EXISTS tb_member1; |
表二:
1 | DROP table IF EXISTS tb_member2; |
接下来开始进行拆分:
1 | insert into tb_member1(id,name,sex) select id,name,sex from dd_user where id%2=0; |
创建MERGE主表
创建一个主表:
1 | DROP table IF EXISTS tb_member_all; |
执行上述出现如下问题:
1 | ERROR 1168 (HY000): Unable to open underlying table which is differently defined |
需要检查:
- 查看上面的分表数据库引擎是不是 MyISAM;
- 查看分表与指标的字段定义是否一致。
成功以后,在 member1
或者 member2
中创建数据 member_all
表中也会出现同样的数据
所以:tb_member_all
表就是 tb_member1
,tb_member2
的并集
其实 tb_member_all
表里面是没有存储数据,它就是一个外壳,里面的数据是 tb_member1
,tb_member2
的并集,数据的存储是放在分表中
插入数据
id%2
这是取模处理,分配数据进入哪个数据表;
查询数据
做分页的时候就利用 tb_member_all
表去做分页查询实现