Mycatの——プログラム指定パーティションスライス

12167 ワード

転載は出典を明記してください.http://blog.csdn.net/l1028386804/article/details/77140429
一、簡単な説明
プログラムはパーティションスライスを指定します.つまり、プログラムが実行している実行中にルールに基づいてデータのスライス結果を自動的に指定します.具体的なルールは以下の通りです.
このルールは,実行段階でそのスライスへのルーティングを自主的に決定するアプリケーションがある.この方法は、文字列(数値でなければならない)に基づいて直接分割番号を計算します(伝達パラメータを適用し、分割番号を明示的に指定します).
二、データスライスの実現
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がすべてのスライスをルーティングし、すべてのスライスを いてクエリーを う.