垂直拆分:根据业务的维度,将不同的表切分到不同的数据库之上,也叫做纵向拆分。例如:所有的订单都保存到订单库中,所有的用户都保存到用户库中,同类型的表保存在同一库,不同的表分散在不同的库中。
Mycat水平拆分
修改主服务器的server.xml
0:本地文件方式
在mycat/conf/sequence_conf.properties文件中:
GLOBAL.MINDI=10000最小值
GLOBAL.MAXID=20000最大值,建议修改到9999999999
1:数据库方式
分库分表中保证全局主键自增唯一,但是需要执行mycat函数,配置sequence_db_conf.properties
2:时间戳方式
mycat实现的时间戳,建议varchar类型,要注意id的长度
<!-- 修改主键的方式 --> <property>0</property>修改主服务器的sequence_conf.properties
#default global sequence GLOBAL.HISIDS= # 可以自定义关键字 GLOBAL.MINID=10001 # 最小值 GLOBAL.MAXID=20000 # 最大值 GLOBAL.CURID=10000修改主服务器的schema.xml
table标签定义了逻辑表,所有需要拆分的表都需要在这个标签中定义。
rule属性:拆分规则。mod-long是拆分规则之一,主键根据服务器数量取模,在rule.xml中指定。如果是3个数据库,那么数据取模后,平均分配到三个库中。
name属性:定义逻辑表的表名,这个名字就如同在数据库中执行create table命令指定的名字一样,同一个schema标签中定义的表名必须是唯一的。
dataNode属性: 定义这个逻辑表所属的dataNode,该属性的值需要和dataNode标签中name属性的值相互对应。
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema checkSQLschema="false" sqlMaxLimit="100"> <table primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long"/> </schema> <dataNode dataHost="localhost1" database="db1" /> <dataNode dataHost="localhost1" database="db2" /> <dataNode dataHost="localhost1" database="db3" /> <dataHost maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- write --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- read --> <readHost host="hostS1" url="192.168.203.135:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>修改主服务器的rule.xml
<function> <!-- 数据库的数量 --> <property>3</property> </function>
测试
mycat操作
-- 创建product表 CREATE TABLE product( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), price INT ); -- 添加6条数据 INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'苹果手机',6999); INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'华为手机',5999); INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'三星手机',4999); INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'小米手机',3999); INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'中兴手机',2999); INSERT INTO product(id,NAME,price) VALUES (NEXT VALUE FOR MYCATSEQ_GLOBAL,'OOPO手机',1999); -- 查询product表 SELECT * FROM product;主服务器操作
-- 在不同数据库中查询product表 SELECT * FROM product;从服务器操作
-- 在不同数据库中查询product表 SELECT * FROM product;
Mycat垂直拆分
修改主服务器的schema
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema checkSQLschema="false" sqlMaxLimit="100"> <table primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long"/> <!-- 动物类数据表 --> <table primaryKey="id" autoIncrement="true" dataNode="dn4" /> <table primaryKey="id" autoIncrement="true" dataNode="dn4" /> <!-- 水果类数据表 --> <table primaryKey="id" autoIncrement="true" dataNode="dn5" /> <table primaryKey="id" autoIncrement="true" dataNode="dn5" /> </schema> <dataNode dataHost="localhost1" database="db1" /> <dataNode dataHost="localhost1" database="db2" /> <dataNode dataHost="localhost1" database="db3" /> <dataNode dataHost="localhost1" database="db4" /> <dataNode dataHost="localhost1" database="db5" /> <dataHost maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- write --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- read --> <readHost host="hostS1" url="192.168.203.135:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
测试