mycat 分表子查询_mycat - 水平分表

博客介绍了数据库水平拆分与垂直拆分的区别,以orders表为例说明Mycat水平分表的配置,包括schema.xml和rule.xml的配置及测试插入数据。还解决了水平分表后关联查询报错问题,将orders_detail表也水平分表。此外,介绍了全局表的概念、适用场景及配置方法。

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

相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。

例如,分库中的举例,orders表水平分到order_win和order_linux两个库中。

配置mycat的schema.xml

确认两个库中都有orders表,没有就新建下。

配置rule, vim /usr/local/mycat/conf/rule.xml

重启mycat,在mycat中执行测试插入数据。

insert into orders(id,order_type,customer_id,amount)values(1,1,1,1000.00);

insert into orders(id,order_type,customer_id,amount)values(2,1,2,1000.00);

insert into orders(id,order_type,customer_id,amount)values(3,1,3,1000.00);

insert into orders(id,order_type,customer_id,amount)values(4,1,4,1000.00);

insert into orders(id,order_type,customer_id,amount)values(5,1,5,1000.00);

insert into orders(id,order_type,customer_id,amount)values(6,1,6,1000.00);

结果:两个库中的orders各有一部分数据。是根据customer_id通过mod-long算法,计算出要插入哪个库的哪个orders表。

此时有个问题,orders表已经水平分表,然而orders_detail表并没有;此时如果做这两个表的关联查询会报错,因为部分数据不能找到表。

解决思路:把orders_detail也水平分表,但是要求实现订单详细记录要和订单记录在同一库中。

修改:schema.xml,并建立相关表,我的是在orders_linux下创建order_detail。

重启mycat,执行。

insert into orders_detail(id,detail,order_id)values(1,"球鞋一双",1);

insert into orders_detail(id,detail,order_id)values(2,"牙膏1",2);

insert into orders_detail(id,detail,order_id)values(3,"牙刷2",2);

insert into orders_detail(id,detail,order_id)values(4,"T恤",3);

insert into orders_detail(id,detail,order_id)values(5,"手套",3);

insert into orders_detail(id,detail,order_id)values(6,"帽子",3);

insert into orders_detail(id,detail,order_id)values(7,"金克斯",4);

insert into orders_detail(id,detail,order_id)values(8,"卢锡安",4);

insert into orders_detail(id,detail,order_id)values(9,"诺克",5);

insert into orders_detail(id,detail,order_id)values(10,"盲僧",6);

insert into orders_detail(id,detail,order_id)values(11,"狼人",6);

insert into orders_detail(id,detail,order_id)values(12,"赵信",6);

结果:有关此订单的详细记录就会进入同一个库中。

此时订单有状态,描述状态的表,在每个库中都有用,所以需要每个用到的库都保留一份。也称作全局表。

》对于全局表,每个库中都有一份,mycat写操作时所有的库都要同步更新;所以,全局表一般不能是大数据表或者频繁修改的表。一般为字典表,系统表为宜。

全局表配置如下:

新建dict_order_type表,重启mycat,测试插入数据。

insert into dict_order_type values(101,'付款');

insert into dict_order_type values(101,'发货');

在mycat执行后,会发现两个库中的全局表dict_order_type,都会插入数据。注意id需要使用从序列表读出的数据。

insert into orders(id,order_type,customer_id,amount)values(next value for MYCATSEQ_ORDERS,1,1,1000.00);

### MyCat 中实现水平分表的方法及配置教程 #### 1. 配置 `schema.xml` 文件 为了使 MyCat 能够识别并处理片逻辑,在 `conf/schema.xml` 文件中定义数据库和表结构以及片规则非常重要。对于要进行水平分表的数据表,需指定具体的片算法。 ```xml <schema name="TESTDB" checkSQLSchema="false" sqlMaxLimit="100"> <table name="orders" dataNode="dn1,dn2" rule="mod-long"/> </schema> <dataNode name="dn1" dataHost="localhost1" database="testdb"/> <dataNode name="dn2" dataHost="localhost2" database="testdb"/> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 主机 --> <writeHost host="hostM1" url="xxx.xxx.xxx.xx1:3306" user="root" password="password"> <readHost host="hostS1" url="xxx.xxx.xxx.xx2:3306" user="root" password="password"/> </writeHost> </dataHost> <dataHost name="localhost2" ... /> ``` 上述 XML 片段展示了如何设置名为 `orders` 的表布在两个不同的节点上,并采用模数取余(`mod-long`)作为路由策略[^4]。 #### 2. 创建实际物理表 确保所有参与片的 MySQL 实例都已创建好相应的物理表。这里假设我们有两个 MySQL 数据库实例别位于不同主机上: ```sql CREATE DATABASE IF NOT EXISTS testdb; USE testdb; CREATE TABLE IF NOT EXISTS orders ( id BIGINT UNSIGNED AUTO_INCREMENT, amount DECIMAL(10 , 2 ), customer_id INT, order_type TINYINT, PRIMARY KEY (id), INDEX idx_customer_id(customer_id) ); ``` 此 SQL 语句用于初始化每个真实存在的订单表结构[^5]。 #### 3. 插入测试数据 当一切准备就绪后,可以通过向虚拟表插入记录来验证片功能是否正常工作。由于启用了全局序列支持,因此可以直接利用内置函数获取唯一键值。 ```sql INSERT INTO orders(amount, customer_id, order_type) VALUES(NEXT VALUE FOR MYCATSEQ_ORDERS, 1000, 101, 102); SELECT * FROM orders WHERE customer_id = 101 LIMIT 10; ``` 这段命令会触发 MyCat 将新纪录配到合适的子表内存储,并允许查询特定条件下的部结果集[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值