核心文件:
server.xml
schema.xml
rule.xml
垂直拆分
(1)将一个库中数据表拆分到对应的库中,完成垂直拆分
比如原始项目库中包含用户、订单、商品模块的数据表,现在按照模块分别建立数据库,将数据库中
数据表拆分到对应数据库中,完成垂直拆分(微服务模式就已经做了垂直拆分)
(2)将一张有多个字段的表按照字段使用频率来拆分成多张表,完成垂直拆分
水平拆分
(1)将原始库进行复制多份(库表都是一样的),然后将数据按规则向这多个库进行存储,来达到水平拆分
比如原始库需要存储1000w条数据,将库复制5份,那么每个库将分别存储200w数据,这样原始库就不会存储数据量将大大减轻
分片
根据分区规则字段进行分片存储,那么如果根据分区规则字段查询时,也会根据分区规则路由到对应的分片上
全局表
分析:在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题
采用全局表来解决该问题,它具有以下特性:
• 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
• 全局表的查询操作,只从一个节点获取
• 全局表可以跟任何一个表进行 JOIN 操作
全局表配置比较简单,不用写 Rule 规则,修改schema.xml,如下配置即可:
<table name="company" primaryKey="id" type="global" dataNode="dn1,dn2" />
联表操作
分析:如果主表的数据在1分片,从表对应的数据在2分片,那么这一次联表查询就需要跨节点,性能严重损耗
采用配置子表来解决该问题,修改schema.xml,如下配置即可:
<table name="tab_user" dataNode="dn1,dn2" rule="mod-long"> <childTable name="tab_orders" joinKey="user_id" parentKey="id"/> </table>
mycat将tab_orders的user_id和tab_user的id关联起来,在对orders表进行插入操作时,将会判断插入数据的user_id处于哪一个分片, 然后将数据插入该分片,这样便实现了将关联数据存放在一个分片的目的。当然,如果关联了更多的表,就继续在childTable下面配置childTable
注意:使用mycat后,不能再使用数据库主键自增了