Mysql分表(一)Merge

本文介绍了MySQL中的Merge分表功能,这是一种简单的分表方法,无需修改程序代码即可实现。Merge表本身不保存数据,而是与分表形成映射关系。文章详细解释了Merge表的操作步骤及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:介绍:merge是Mysql最简单的一种分表,Mysql自带的一个分表功能,Merge表并不保存数据,Merge表和分表是对应映射关系。

二:优缺点:

优点:使用简单,不用修改程序代码,最多我们修改一下Merage表名就可以兼容以前程序(修改表名的时候一定要备份以前的,以防万一。)

缺点:

a:只能使用MyISAM引擎

b:很难平均分配,比如Merage设置插入条件,要么只能插入到第一个表,要么插入到最后一个表。

c:没有约束ID,比如现在是在第一个表插入,后面我改成在第二个表插入,那么ID在Merage表中就会重复,ID不唯一,就会造成很多程序异常。解决这个问题,需要统一规则,不能一会儿在前面插入,一会儿在后面插入,也不能直接在分表插入,分表插入不是不可以,如果统一了全局ID,可以在分表插入。

综合适应场景:merge分表非常适合开始没做好规划,后来数据量上来,要拆分表的情况;比如接手一个项目,上一路人马把几千万条数据弄在一个表里面,拆表很可能就要改sql,此时你心里肯定一千个草泥马,用merge分表这种方式不需要改代码即可轻松实现。

三:操作:

1:实验把一个表分成两个表,假设原表t数据量太大,现在拆开了成两个表,t1和t2;

(1):首先把t1表复制到两个表,只复制表结构,不要复制数据

 

create table t1 like t
create table t2 like t

这样数据多了两个表,t1和t2

 

(2):拆分t表数据到t1和t2,既然是拆分两个表,肯定是平均分配,这里用一个简单的方法拆分数据:

 id%2=0的数据划分到t1表, id%2=1的划分到t2表,下面复制数据,分别执行:

 

insert into t1 select * from t where id%2=0
insert into t2 select * from t where id%2=1

 

通过上图看到执行成功,t表一共10条数据,平均分配到了t1和t2表

2:创建Merge表:

创建语法和创建表语法一样,只是多了几个参数:

CREATE TABLE `tall` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `sex` int(1) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`t1`,`t2`);

备注:

tall:Merge表名;

INSERT_METHOD:表示插入方式;

INSERT_METHOD=LAST 添加数据的时候插入到最后一个表,这里就是t2

INSERT_METHOD=FIRST 添加数据的时候插入到第一个表,这里就是t1

INSERT_METHOD=0 不允许插入

UNION = (t1,t2) 关联t1和t2表 

Merge表 数据结构必须和分表完全一致

上面蓝色部分ENGINE必须是MRG_MyISAM或者MERGE,这两个是一个意思。

查看一下数据库:

Merage表tall已建立成功

这样对两个表的CURD操作,只需要操作Merge表就行了,这样不用改动代码

点击查看全部

MySQL分表之后,要实现分页查询,可以采用以下解决方案。首先,需要创建个主表,该主表是由所有分表合并而成的。可以使用MERGE存储引擎来创建主表,并将所有分表通过UNION关键字合并到主表中。例如,可以创建个名为tb_member_all的主表,通过UNION将tb_member1和tb_member2两个分表合并到主表中。在创建主表时,需要指定合适的排序字段,比如按照注册时间排序。接下来,可以使用普通的SQL语句来进行分页查询,通过LIMIT关键字指定需要查询的页数和每页的记录数。例如,可以使用类似以下的SQL语句来查询最近注册的第3页用户: SELECT * FROM tb_member_all ORDER BY register_time DESC LIMIT 20, 10; 其中,20表示从第20条记录开始,10表示每页显示10条记录。这样就可以实现分页查询了。需要注意的是,由于分表后数据存储在不同的物理表中,所以在查询时需要使用主表来进行查询,以保证数据的完整性和正确性。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [MySQL分库分表的分页查询解决方案](https://blog.youkuaiyun.com/weixin_30658827/article/details/113968084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql分表+分页查询](https://blog.youkuaiyun.com/joy_tom/article/details/109857573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值