连接MYSQL,创建DEMO所用三个分片数据库;
CREATE database db1;
CREATE database db2;
CREATE database db3;
注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。
在MySQL的配置文件中my.ini [mysqld] 中增加一行
lower_case_table_names = 1
编辑MYCAT_HOME/conf/schema.xml文件,修改dataHost对应的连接信息:
mycat 安装部署
注意writeHost/readHost中的location,user,password的值符合你所采用的Mysql的连接信息。
修改完成后保存,进入到MYCAT_HOME/bin目录下,执行启动命令:startup.bat ,启动成功以后显示如下信息:
mycat 安装部署
注意,默认数据端口为8066,管理端口为9066。
客户端也可以用图形化的客户端如:mysqlworkbench、 navicat 、以及一些基于Java的数据库客户端来访问,注意要填写端口号8066,以及database 为TESTDB。
命令行运行:mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB 就能访问OpenCloudDB了,以下操作都在此命令行里执行(JDBC则将mysql的URL中的端口3306改为8066即可)
提示:访问MyCAT的用户账号和授权信息是在conf/server.xml文件中配置,而MyCAT用来连接后端MySQL库的用户名密码信息则在conf/schema.xml中,这是两套完全独立的系统,类似的还有MyCAT的逻辑库(schema),逻辑表(table)也是类似的。
Employee表,是根据规则sharding-by-intfile (分片字段为sharding_id)进行分片。创建employee表:输入如下SQL
create table employee (id int not null primary key,name
客户端也可以用图形化的客户端如:mysqlworkbench、 navicat 、以及一些基于Java的数据库客户端来访问,注意要填写端口号8066,以及database 为TESTDB。
命令行运行:mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB 就能访问OpenCloudDB了,以下操作都在此命令行里执行(JDBC则将mysql的URL中的端口3306改为8066即可)
提示:访问MyCAT的用户账号和授权信息是在conf/server.xml文件中配置,而MyCAT用来连接后端MySQL库的用户名密码信息则在conf/schema.xml中,这是两套完全独立的系统,类似的还有MyCAT的逻辑库(schema),逻辑表(table)也是类似的。
Employee表,是根据规则sharding-by-intfile (分片字段为sharding_id)进行分片。创建employee表:输入如下SQL
create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
运行explain指令,查看该SQL被发往哪些分片节点执行:
explain create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
mycat 安装部署
建议参照schema.xml中employee表的定义,以及其分片规则,来看看什么数据会出现在dn1上,什么数据会出现在dn2上。
温馨提示:explain可以用于任何正确的SQL上,其作用是告诉你,这条SQL会路由到哪些分片节点上执行,这对于诊断分片相关的问题很有帮助。另外,explain可以安全的执行多次,它仅仅是告诉你SQL的路由分片,而不会执行该SQL。
插入数据:
insert into employee(id,name,sharding_id) values(1,’leader us’,10000);
insert into employee(id,name,sharding_id) values(2, ‘me’,10010);
insert into employee(id,name,sharding_id) values(3, ‘mycat’,10000);
insert into employee(id,name,sharding_id) values(4, ‘mydog’,10010);
company表是根据规则auto-sharding-long(主键范围)进行分片。创建company表:输入如下SQL
create table company(id int not null primary key,name varchar(100));
录入数据:
insert into company(id,name) values(1,’hp’);
insert into company(id,name) values(2,’ibm’);
insert into company(id,name) values(3,’oracle’);
你会看到三个分片上都插入了3条数据,因为company定义为全
insert into employee(id,name,sharding_id) values(3, ‘mycat’,10000);
insert into employee(id,name,sharding_id) values(4, ‘mydog’,10010);
company表是根据规则auto-sharding-long(主键范围)进行分片。创建company表:输入如下SQL
create table company(id int not null primary key,name varchar(100));
录入数据:
insert into company(id,name) values(1,’hp’);
insert into company(id,name) values(2,’ibm’);
insert into company(id,name) values(3,’oracle’);
你会看到三个分片上都插入了3条数据,因为company定义为全局表,用explain来确认这个情况:
explain insert into company(id,name) values(1,’hp’)
返回3个节点的信息:
| DATA_NODE | SQL |
+———–+———————————————+
| dn1 | insert into company(id,name) values(1,’hp’) |
| dn2 | insert into company(id,name) values(1,’hp’) |
| dn3 | insert into company(id,name) values(1,’hp’) |
+———–+———————————————+
创建客户表:
create customer: create table customer(id int not null primary key,name varchar(100),company_id int not null,sharding_id int not null);
插入数据:
insert into customer (id,name,company_id,sharding_id )values(1,’wang’,1,10000); //stored in db1;
insert into customer (id,name,company_id,sharding_id )values(2,’xue’,2,10010); //stored in db2;
insert into customer (id,name,company_id,sharding_id )values(3,’feng’,3,10000); //stored in db1;
查询结果:
Select * from customer;
explain Select * from customer; (确认数据是分片存储)
创建表格orders,并插入数据:
create table orders (id int not null primary key ,customer_id int not null,sataus int ,note varchar(100) );
insert into orders(id,customer_id) values(1,1); //stored in db1 because customer table with id=1 stored in db1
insert into orders(id,customer_id) values(2,2); //stored in db2 because customer table with id=1 stored in db2
explain insert into orders(id,customer_id) values(2,2);
select customer.name ,orders.* from customer ,orders where customer.id=orders.customer_id;
travelrecord根据ID主键的范围进行分片:
create travelrecord: create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
insert into travelrecord (id,user_id,traveldate,fee,days) values(1,'wang','2014-01-05',510.5,3);这个ID就存放在分片0上了
mycat 安装部署
explain insert into travelrecord (id,user_id,traveldate,fee,days) values(7000001,’wang’,’2014-01-05’,510.5,3); 这个ID就存放在分片1上了
mycat 安装部署
看到支持跨分片的JOIN!
热点新闻,用取摸的方式随机分配到dn1,dn2,dn3上
create table hotnews(id int not null primary key ,title varchar(400) ,created_time datetime);
插入数据
insert into hotnews(id,title,created_time) values(1,’first’,now()); 在分片1上
mycat 安装部署
而Id为5,则到dn3上,5%3=2 ,即对应dn3的 index
mycat 安装部署
其他:
goods表
create table goods(id int not null primary key,name varchar(200),good_type tinyint,good_img_url varchar(200),good_created date,good_desc varchar(500), price double);