DB2: [5,6,7,8,9,16,17]
DB3: [20,21,22,23,24,25,26]
经过最小堆计算后得到最小序列 [0,1,2,3,4,5,6] ,然后返回偏移量为5的两个结果为 [5,6] 。
虽然Mycat返回了正确的结果,但是仔细推敲发现这类操作的处理逻辑是及其消耗(浪费)资源的 。应用需要的结果集为2条,Mycat中需要处理的结果数为21条 。也就是说,对于有 t 个DB节点的全分片 limit m, n 操作,Mycat需要处理的数据量为 (m+n)*t 个 。比如实际应用中有50个DB节点,要执行limit 1000,10操作,则Mycat处理的数据量为 50500 条,返回结果集为 10 ,当偏移量更大时,内存和CPU资源的消耗则是数十倍增加 。
如果设计使用Mycat时有分页排序,请考虑放弃!
3.任意表JOIN先看一下在单库中JOIN中的场景 。假设在某单库中有 player 和 team 两张表, player 表中的 team_id 字段与 team 表中的 id 字段相关联 。操作场景如下图:
文章插图
JOIN操作的SQL如下
mysql>select p_name,t_name from player p, team t where p.no = 3 and p.team_id = t.id;
此时能查询出结果
p_name
t_name
Wade
Heat
如果将这两个表的数据分库后,相关联的数据可能分布在不同的DB节点上,如下图:
文章插图
这个SQL在各个单独的分片DB中都查不出结果,也就是说Mycat不能查询出正确的结果集 。
设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请考虑放弃!
4.分布式事务Mycat并没有根据二阶段提交协议实现 XA事务 ,而是只保证 prepare 阶段数据一致性的 弱XA事务 ,实现过程如下:
应用开启事务后Mycat标识该连接为非自动提交,比如前端执行
mysql>begin;
Mycat不会立即把命令发送到DB节点上,等后续下发SQL时,Mycat从连接池获取非自动提交的连接去执行 。
文章插图
Mycat会等待各个节点的返回结果,如果都执行成功,Mycat给该连接标识为 Prepare Ready 状态,如果有一个节点执行失败,则标识为 Rollback 状态 。
文章插图
执行完成后Mycat等待前端发送
推荐阅读
- 深度解析SQL和oracle等数据库的历史,说点不一样的给你
- 数据库压力测试方法小结
- 亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行
- 勒索病毒加密数据库解决方案
- Laravel数据库迁移的那些个小技巧
- 还在手动整理数据库文档?试试这个工具
- 使用IDEA连接mysql数据库
- Springboot 实现数据库备份还原
- 对我来说数据库图形化管理工具用这个足够了
- MySQL5.7数据库安装与远程连接