分享Mycat实战使用过程遇到的问题

概述:
如下为实际生产使用过程中,遇到的问题,作为总结,希望对大家所帮助。

1、关于读写分离问题,代码中有start TRANSACTION的时候,只要有读写的操作都访问的是主库,如下示例:
start TRANSACTION;
UPDATE torder SET pay_amount = 13 WHERE member_id = 9 and id = ‘611000000009’;
SELECT pay_amount FROM torder WHERE member_id = 9 and id = ‘611000000009’;
ROLLBACK;start TRANSACTION;
UPDATE torder SET pay_amount = 13 WHERE member_id = 9 and id = ‘611000000009’;
SELECT pay_amount FROM torder WHERE member_id = 9 and id = ‘611000000009’;
ROLLBACK;

2、Select 中DISTINCT不支持对"" AS goodsCount的查询,如下示例:

SELECT DISTINCT
(cs.id) AS customerServiceId,
ri.id AS trefundInfoId,
ri.order_store_id AS orderStoreId,
cs.aftermarket_type AS aftermarketType,
cs.approval_status AS approvalStatus,
tcd.state AS credentialsApprovalStatus,
tcd.upload_time AS uploadTime,
“” AS goodsCount,
“” AS payAmount,…
3、mycat注意事项:distinct 和 select 查询列中用子查询的会冲突,二者选其一
SELECT DISTINCT
ts.stock_id,
ts.warehouse_id,
ts.goods_sku_id,
ts.shop_id,
ts.goods_id,
tgi.goods_type,
ts.stock_warehouse,
ts.stock_sales,
ts.stock_max,
ts.stock_min,
ts.stock_less,
tw.warehouse_name,
tgi.is_fresh_food,
tsi.sku_name,
tsi.storage_unit stock_unit,
tsi1.stock_value front_stock_value,
tsi1.stock_max front_stock_max,
tsi1.stock_min front_stock_min,
tsi1.urgent_warning_value front_urgent_warning_value,
tsi2.stock_value back_stock_value,
tsi2.stock_max back_stock_max,
tsi2.stock_min back_stock_min,
tsi2.urgent_warning_value back_urgent_warning_value,
(
SELECT
GROUP_CONCAT(tsb.bar_code)
FROM
tgoods_sku_barcode tsb
WHERE
tsb.sku_id = ts.goods_sku_id
) barcode,

4、报错:where条件中使用or导致
In subQuery,the or condition is not supported

select
t.template_id, t.template_name, t.template_desc, t.template_type,t.template_status, t.template_channel,
t.approval_status,t.template_tag,t.is_test,t.template_shop,t.template_rule,t.template_goods
from tcoupon_template t
where t.template_status = 0
and EXISTS (
select tb.batch_id
from tcoupon_batch tb
where tb.template_id =t.template_id or
tb.template_json like CONCAT(’%Id":’,t.template_id,’,%’)

)

5、mycat配置sql执行超时问题,mysql参数配置 单位秒
999999999
在这里插入图片描述

6、分片字段不能被更新,所以如果程序端有对分片字段更新的操作,需要修改
7、不支持 Insert into 中不包括字段名的 SQL语句,如果程序端涉及的sql没有不包含字段,需要修改
8、insert into x select from y 的sql语句不被支持
9、对于跨库的查询需要通过catlet实现,并且不支持超过两张表的查询,具体语法如下
/*!mycat:catlet=io.mycat.catlets.ShareJoin */select * from torder_test a,torder_t c where c.member_id=a.member_id;
10、Mycat目前支持2个表Join,如果有超过两张表的查询,代码需要修改
11、查询最好能够按照分片字段,否则查询效率不是太好

12、关于order by排序问题
Order by 后的排序字段必须是select的一部分,全局表的时候除外
在这里插入图片描述
全局表
在这里插入图片描述
13、关于插入字段不包含分片字段
在这里插入图片描述
14、关于多表更新:
多表更新不支持 update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id
在这里插入图片描述

UPDATE tgoods_info g
JOIN tgoods_sku_info sku ON g.goods_id = sku.goods_id
JOIN twms_purchase_plan p ON p.sku_id = sku.goods_sku_id
SET p.is_test = g.is_test
WHERE
p.is_test != g.is_test
OR p.is_test IS NULL;
在这里插入图片描述

但支持子查询方式 update a set a.nation=’China’ where id in (select id from b);
在这里插入图片描述
15、关于批量insert问题
多行插入 insert into tab_a(c1,c2) values(v1,v2),(v11,v21)… ##针对的是ER分表的从表无法批量插入

复杂删除(mycat1.6.5支持) delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名

在这里插入图片描述

在这里插入图片描述

16、Mysql 开启gtid不被允许执行的sql语句
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值