mysql merge 分表 效率_Mysql的Merge存储引擎实现分表查询

当数据表的大小导致I/O效率降低时,分表成为必要选择。MySQL提供了解决方案,包括Partition和Merge存储引擎。本文重点讨论Merge引擎,它支持MyISAM引擎,并允许通过ALTER TABLE添加新基础表。查询Merge表与普通表相同,但不负责唯一性检查,需要在插入时确保数据唯一。此外,要注意自增主键的唯一性和使用重命名表来切换,以及触发器和存储过程的移植。
摘要由CSDN通过智能技术生成

对于数据量很大的一张表,i/o效率底下,分表势在必行!

使用程序分,对不同的查询,分配到不同的子表中,是个解决方案,但要改代码,对查询不透明。

好在mysql 有两个解决方案:

Partition(分区,在MySQL 5.1.中实现) 和 Mysql Merge存储引擎。 只是支持MyISAM引擎,而分区者没有限制。

本文讨论 Mysql Merge存储引擎。

CREATE TABLE t1 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20));

CREATE TABLE t2 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20));

INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');

INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');

CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

对应定期分表的情况下,只要定期相应的增加一个基础表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name  UNION=(...))。

如在增加一个表(需和其他基础表一样的结构):

CREATE TABLE t3(  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20));

ALTER TABLE total  UNION=(t1,t2,t3)

INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一个表),LAST(最后一个表),NO(不能插入)

查询的时候,和平常一样

select * from total where ....

merge表会自动找到相应的基础表进行查询。

需要注意的是 merge表并不维护 “唯一性”检查,唯一性有各基础表完成。所以插入新的记录时候可能和其他基础表的内容重复。所以再插入去需要用代码进行唯一性检查。

另外需要注意两个问题:

1、添加新表时,如果自增主键需要保持唯一性,需要执行以下语句:

alter table t3 auto_increment = 5

则 t3 的 id 属性值将从 5 开始递增

2、为尽量减少对现有业务的影响,建议切换表用重命名表的方式:

rename table total to old_table_name;

3、注意移植触发器和存储过程

详情参考: 站长教学网 eduyo.com

错误解决方法:

drop table if exists t1,t2,total;

CREATE TABLE t1 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20))engine=myisam ;

CREATE TABLE t2 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20))engine=myisam ;

CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

INSERT INTO t1 (message) VALUES ('Testing_t1'),('table_t1'),('t1');

INSERT INTO t2 (message) VALUES ('Testing_t2'),('table_t2'),('t2');

INSERT INTO total (message) VALUES ('Testing_total'),('table_total'),('total');

desc total;

即创建表的语句制定引擎即可: engine=myisam

另外,创建分表也可以用like,如:CREATE TABLE t2 like t1;

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.csdn.net/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.csdn.net/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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值