一对一代理,即一个Mycat后端连接一个MySQL
Mycat.逻辑库.逻辑表 ———————-映射—————————> MySQL.物理库.物理表
8066.db1.t1———————-映射—————————> 3306.db1.t1
8066.db1.t2———————-映射—————————> 3306.db1.t2
此时只需要把查询t1或者t2或者t1或者t2的sql只需要转发到3306上面
一对二代理,即一个Mycat后端连接两个MySQL
Mycat.逻辑库.逻辑表 ———————-映射—————————> MySQL.物理库.物理表
8066.db1.t1———————-映射—————————> 3306.db1.t1
8066.db1.t2———————-映射—————————> 3307.db1.t2
此时只需要把查询t1结果集的sql转发到3306,而查询t2结果集的sql转发到3307
问题1:
在一对二代理情况下,对于select * from t1 join t2 on t1.id = t2.id,怎么查询?
答案:把这个sql拆除两个sql,一条查询3306,一条查询3307
HashJoin(
3306:select from t1,
3307:select from t2
)
问题2:
在一对二代理情况下,怎么得知select * from t1 join t2 on t1.id = t2.id的列信息,假设t1和t2只有id这一列
答案1:Mycat获取3306的t1和3307的t2表信息,然后生成执行计划,得出列信息
答案2:把select * from t1 join t2 on t1.id = t2.id发送到某个mysql上面,这个mysql上面有t1和t2两个表,查询这个sql的列名,但不执行这个sql
8066.db1.t1———————-辅助查询—————————> 某个mysql.db1.t1 ,db1.t2
问题3:
在一对二代理情况下,怎么得出show tables,show columns的结果?
答案1:Mycat获取3306的t1和3307的t2表信息,合拼两个表的信息
答案2:把show tables,show columns发送到某个mysql上面这个mysql,上面有t1和t2两个表,就可以得到正确的结果
8066.db1.t1———————-辅助查询—————————> 某个mysql.db1.t1 ,db1.t2
更复杂的例子……………………..
单表映射,一对二代理,即一个Mycat后端连接两个MySQL
Mycat.逻辑库.逻辑表 ———————-映射—————————> MySQL.物理库.物理表
8066.db1.t1———————-映射—————————> 3306.db1.t_1
8066.db1.t2———————-映射—————————> 3307.db1.t_2
此时只需要把查询t1结果集的sql转发到3306,而查询t2结果集的sql转发到3307,并且把表名改写
问题1:
在一对二代理情况下,对于select * from t1 join t2 on t1.id = t2.id,怎么查询?
答案:把这个sql拆除两个sql,一条查询3306,一条查询3307
HashJoin(
3306:select from t_1,
3307:select from t_2
)
问题2:
在一对二代理情况下,怎么得知select * from t1 join t2 on t1.id = t2.id的列信息,假设t1和t2只有id这一列
答案1:Mycat获取3306的t1和3307的t2表信息,然后生成执行计划,得出列信息
答案2:把select * from t1 join t2 on t1.id = t2.id发送到某个mysql上面,这个mysql上面有t1和t2两个表,查询这个sql的列名,但不执行这个sql
8066.db1.t1———————-辅助查询—————————> 某个mysql.db1.t1
8066.db1.t1———————-映射—————————> 3306.db1.t_1
8066.db1.t2———————-映射—————————> 3307.db1.t_2
问题3:
在一对二代理情况下,怎么得出show tables,show columns的结果?
答案1:Mycat获取3306的t1和3307的t2表信息,合拼两个表的信息
答案2:把show tables,show columns发送到某个mysql上面这个mysql,上面有t1和t2两个表,就可以得到正确的结果
8066.db1.t1———————-辅助查询—————————> 某个mysql.db1.t1,db1.t2
8066.db1.t1———————-映射—————————> 3306.db1.t_1
8066.db1.t2———————-映射—————————> 3307.db1.t_2
问题4:
怎么执行create table t1?
答案1:Mycat在默认存储数据的mysql上面执行create table t1,然后更新mycat配置
答案2:Mycat在默认存储数据的mysql上面执行create table t1,在某个mysql上面执行create table t1,然后更新
8066.db1.t1———————-辅助建立—————————> 某个mysql.db1.t1
8066.db1.t1———————-存储映射—————————> 默认的mysql.db1.t1
问题5:
怎么执行create table db1.t1,t1映射到3307.db1.t_1表上?
答案1:Mycat在3307.db1.t_1的mysql上面执行create table t_1,然后更新mycat配置,逻辑表名是db1.t1
答案2:Mycat在某个mysql上面执行create table t1,在3307.db1.t_1的mysql上面执行create table t_1,然后更新mycat配置,逻辑表名是db1.t1
8066.db1.t1———————-辅助建立—————————> 某个mysql.db1.t1
8066.db1.t1———————-存储映射—————————> 3307.db1.t_1
问题6:
怎么执行drop table db1.t1,t1映射到3307.db1.t_1表上?
答案1:Mycat在3307.db1.t_1mysql上面执行drop table t_1,然后更新mycat配置,删除逻辑表db1.t1
答案2:Mycat在某个mysql上面执行drop table t1,在3307.db1.t_1的mysql上面执行drop table t_1,删除逻辑表db1.t1
8066.db1.t1———————-辅助删除—————————> 某个mysql.db1.t1
8066.db1.t1———————-删除存储—————————> 3307.db1.t_1
上文中的某个mysql或者默认存储数据的mysql就是原型库,Mycat执行SQL未必使用原型库,但是有些情况,Mycat分析不了SQL就需要使用原型库
获取3306的t1和3307的t2表信息 此处一般是根据mycat配置文件生成的信息,为什么不直接使用mysql的信息,因为逻辑表的字段与mysql的表的字段未必相同,比如mysql的表带有分片表的系统字段,比如校验码字段,,而逻辑表并不没有这字段.这也就是为什么配置里面会配置建表sql
drop 和 create table行为看具体版本的实现,最理想的情况是只删除存储,不影响其他表,但是实际上很多情况还需要原型库辅助完成sql的分析,建议自己实现alter,drop 表,不要通过mycat