Mycatの——プログラム指定パーティションスライス
12167 ワード
転載は出典を明記してください.http://blog.csdn.net/l1028386804/article/details/77140429
一、簡単な説明
プログラムはパーティションスライスを指定します.つまり、プログラムが実行している実行中にルールに基づいてデータのスライス結果を自動的に指定します.具体的なルールは以下の通りです.
このルールは,実行段階でそのスライスへのルーティングを自主的に決定するアプリケーションがある.この方法は、文字列(数値でなければならない)に基づいて直接分割番号を計算します(伝達パラメータを適用し、分割番号を明示的に指定します).
二、データスライスの実現
1、rule.xmlの構成
rule.xmlに次の構成を追加します.
2、schema.xmlの構成
一、簡単な説明
プログラムはパーティションスライスを指定します.つまり、プログラムが実行している実行中にルールに基づいてデータのスライス結果を自動的に指定します.具体的なルールは以下の通りです.
このルールは,実行段階でそのスライスへのルーティングを自主的に決定するアプリケーションがある.この方法は、文字列(数値でなければならない)に基づいて直接分割番号を計算します(伝達パラメータを適用し、分割番号を明示的に指定します).
二、データスライスの実現
1、rule.xmlの構成
rule.xmlに次の構成を追加します.
0
1
8
0
CODE
sharding-by-substring-customer
2、schema.xmlの構成
select user()
,Mycat , Mycat 。
、
1、
mysql> explain CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME);
+-----------+------------------------------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------------------------------------------------------------------------------+
| dn1 | CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME) |
| dn2 | CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME) |
+-----------+------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME);
Query OK, 0 rows affected (0.38 sec)
Mycatログを するには、 の に います. 08/13 09:49:52.185 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME), route={
1 -> dn1{CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME)}
2 -> dn2{CREATE TABLE t_order (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(64),SN VARCHAR(64),CREATE_TIME DATETIME)}
} rrs
データテーブルを すると、MycatはSQLをすべてのデータスライスにルーティングします.
2、データの mysql> explain INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW());
+-----------+-------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+-------------------------------------------------------------------------------------------------+
| dn1 | INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW()) |
+-----------+-------------------------------------------------------------------------------------------------+
1 row in set (0.12 sec)
mysql> INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW());
Query OK, 1 row affected (0.05 sec)
mysql> explain INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW());
+-----------+-------------------------------------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+-------------------------------------------------------------------------------------------------+
| dn2 | INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW()) |
+-----------+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW());
Query OK, 1 row affected (0.01 sec)
Mycatログ :08/13 09:52:18.358 DEBUG [$_NIOREACTOR-0-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW())
08/13 09:52:18.359 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW()), route={
1 -> dn1{INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(1,'0-10000020','beijing_13-10000010',NOW())}
} rrs
08/13 09:52:59.379 DEBUG [$_NIOREACTOR-0-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW())
08/13 09:52:59.380 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW()), route={
1 -> dn2{INSERT INTO t_order (ID,CODE,SN,CREATE_TIME) VALUES(2,'1-10000030','tianjin_14-10000020',NOW())}
} rrs
このように、データを すると、Mycatはルーティングルールに ってSQLを したデータスライスにルーティングする
3、 データスライスフィールド mysql> explain select * from t_order where code = '0-10000020';
+-----------+-----------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+-----------------------------------------------------------+
| dn1 | SELECT * FROM t_order WHERE code = '0-10000020' LIMIT 100 |
+-----------+-----------------------------------------------------------+
1 row in set (0.16 sec)
mysql> select * from t_order where code = '0-10000020';
+----+------------+---------------------+---------------------+
| ID | CODE | SN | CREATE_TIME |
+----+------------+---------------------+---------------------+
| 1 | 0-10000020 | beijing_13-10000010 | 2017-08-13 09:52:18 |
+----+------------+---------------------+---------------------+
1 row in set (0.01 sec)
Mycatログは のとおりです.08/13 09:54:23.917 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:lyzdbselect * from t_order where code = '0-10000020' value:select * from t_order where code = '0-10000020', route={
1 -> dn1{SELECT *
FROM t_order
WHERE code = '0-10000020'
LIMIT 100}
}
このように、 なクエリーが され、スライスフィールドが されている 、スライスは のスライスノードをクエリーする.
4、スライスフィールドの に って するmysql> explain select * from t_order where CODE like '0-1%';
+-----------+--------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------------+
| dn1 | SELECT * FROM t_order WHERE CODE LIKE '0-1%' LIMIT 100 |
| dn2 | SELECT * FROM t_order WHERE CODE LIKE '0-1%' LIMIT 100 |
+-----------+--------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> select * from t_order where CODE like '0-1%';
+----+------------+---------------------+---------------------+
| ID | CODE | SN | CREATE_TIME |
+----+------------+---------------------+---------------------+
| 1 | 0-10000020 | beijing_13-10000010 | 2017-08-13 09:52:18 |
+----+------------+---------------------+---------------------+
1 row in set (0.01 sec)
Mycatログは のとおりです.08/13 09:55:48.742 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=lyzdb, host=192.168.209.1, user=lyz,txIsolation=3, autocommit=true, schema=lyzdb]select * from t_order where CODE like '0-1%', route={
1 -> dn1{SELECT *
FROM t_order
WHERE CODE LIKE '0-1%'
LIMIT 100}
2 -> dn2{SELECT *
FROM t_order
WHERE CODE LIKE '0-1%'
LIMIT 100}
} rrs
から かるように、スライスフィールド のクエリーであれば、すべてのノードを いて し、1つのスライス にデータが1つであってもrouteルーティングはすべてのスライスを いて クエリーを う.
5、スライスされていないフィールドに って するmysql> explain select * from t_order where SN='beijing_13-10000010';
+-----------+------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------------------------+
| dn1 | SELECT * FROM t_order WHERE SN = 'beijing_13-10000010' LIMIT 100 |
| dn2 | SELECT * FROM t_order WHERE SN = 'beijing_13-10000010' LIMIT 100 |
+-----------+------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
mysql> select * from t_order where SN='beijing_13-10000010';
+----+------------+---------------------+---------------------+
| ID | CODE | SN | CREATE_TIME |
+----+------------+---------------------+---------------------+
| 1 | 0-10000020 | beijing_13-10000010 | 2017-08-13 09:52:18 |
+----+------------+---------------------+---------------------+
1 row in set (0.01 sec)
Mycatログは のとおりです.08/13 09:56:53.947 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:lyzdb select * from t_order where SN='beijing_13-10000010' value:select * from t_order where SN='beijing_13-10000010', route={
1 -> dn1{SELECT *
FROM t_order
WHERE SN = 'beijing_13-10000010'
LIMIT 100}
2 -> dn2{SELECT *
FROM t_order
WHERE SN = 'beijing_13-10000010'
LIMIT 100}
}
から かるように、スライスフィールドのクエリーを わなければ、 のデータでもrouteがすべてのスライスをルーティングし、すべてのスライスを いてクエリーを う.