相對於垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,
每個表中 包含一部分數據。簡單來說,我們可以將數據的水平切分理解爲是按照數據行的切分,就
是將表中的某些行切分 到一個數據庫,而另外的某些行又切分到其他的數據庫中,如下圖:
MySQL單表存儲數據條數是有瓶頸的,單表達到 1000 萬條數據就達到了瓶頸,會影響查詢效率,需要進行水平拆分(分表)進行優化。
Mycat原理圖如下 :
Mycat和Mysql環境搭建如前幾篇文章。
主/從機IP如下說明:
192.168.1.111 主機 dn1
192.168.1.109 從機 dn2
具體分表操作有如下幾個步驟:
一. 選擇分表字段
以 orders 表(表結構語句如下面)爲例,可以根據不同字段進行分表
(1)id(主鍵、或創建時間) 查詢訂單注重時效,歷史訂單被查詢的次數少,如此分片會造成一個節點訪問多,一個訪問少,不平均。
(2)customer_id(客戶 id) 根據客戶 id 去分,兩個節點訪問平均,一個客戶的所 有訂單都在同一個節點。故此處選擇它來分表。
二. 修改schema.xml配置文件
添加table語句(如下截圖),將orders表掛載在兩個節點(dn1,dn2)上
vim /usr/local/mycat/conf/schema.xml
<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>
三. 修改分表規則---客戶id(customer_id)取模
經過前面的分析,我們選擇了客戶id這個字段來作爲分表字段。
在 rule 配置文件裏新增分片規則 mod_rule,並指定規則適用字段爲 customer_id,選擇分片算法 mod-long(對字段求模運算),customer_id 對2個節點(dn1,dn2)求模。
根據結果分片配置算法 mod-long 參數 count 爲 2,即兩個節點。
說明:mod-long(mycat自帶的算法)
vim /usr/local/mycat/conf/rule.xml
把 mod-long函數算法的節點數修改爲2個節點,因爲這裏我們只有兩個節點(dn1,dn2)
rule修改部分的源文件內容:
<tableRule name="mod_rule">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
四. 登錄dn2上的mysql 創建orders這個表
在上節垂直分庫中,我已經在dn1上創建了orders表,此處dn1上就不需要再創建表了
登錄mysql:cd /usr/local/mysql/bin
./mysql -u root -p
創建訂單表 語句如下:
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
五. 訪問 Mycat 實現分片
1. 重啓 Mycat,讓配置生效
cd /usr/local/mycat/bin
./mycat console
2. 登錄mycat
mysql -u mycat -p -h 192.168.1.111 -P 8066
密碼:123456
3. 通過mycat插入數據到orders表中
INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
4. 通過mycat查詢剛剛我們插入的那6條數據(select * from orders;)
六. 分表操作結果分析
如下圖所示,可以看出customer_id=100的數據通過取模操作,3條數據全部插入到了主機中(dn1)。
customer_id=101的通過取模操作,3條數據全部插入到了從機中(dn2)。
也就是說通過配置mycat中的rule.xml規則文件(這裏選擇的是對customer_id取模),將通過mycat插入的數據很好的分到了2個節點上的orders表中,從而達到了分表的目的,減輕了數據庫的壓力。