自定義數字範圍分片適用於「業務對 ID 範圍有明確規劃」的場景,例如:前 500 萬用戶落分片 1,500 萬-1000 萬落分片 2,以此類推。MyCat 通過 AutoPartitionByLong 算法讀取映射文件實現該功能。本文完整演示配置、映射文件、建表、寫入與查詢路由行為。
起始ID-結束ID=分片編號(分片編號從 0 開始)。defaultNode。M(百萬)、K(千)等單位簡寫,如 0-500M=0。<function name="rang-long-04" class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long04.txt</property>
<property name="defaultNode">0</property>
<property name="type">0</property>
</function>
<tablerule name="rang-long-tr04">
<rule>
<columns>ID</columns>
<algorithm>rang-long-04</algorithm>
</rule>
</tablerule>
0-500M=0 # 0 - 5,000,000 → 分片 0 (dn21)
500M-1000M=1 # 5,000,000 - 10,000,000 → 分片 1 (dn22)
1000M-1500M=2 # 10,000,000 - 15,000,000 → 分片 2 (dn23)
CREATE TABLE ORDER0401(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PROVINCE VARCHAR(16),
SN VARCHAR(64),
CREATE_TIME DATETIME
);
-- ID=10001 落在 0-500M → dn21
INSERT INTO ORDER0401(ID,PROVINCE,SN,CREATE_TIME)
VALUES(10001,'shanghai','shanghai10006_10000',NOW());
-- ID=5000001 落在 500M-1000M → dn22
INSERT INTO ORDER0401(ID,PROVINCE,SN,CREATE_TIME)
VALUES(5000001,'shanghai','shanghai10006_5000001',NOW());
mysql> EXPLAIN INSERT ... VALUES(10001,...);
+-----------+--------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------+
| dn21 | INSERT ... VALUES(10001,...) |
+-----------+--------------------------------------------------+
mysql> EXPLAIN INSERT ... VALUES(5000001,...);
+-----------+--------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------+
| dn22 | INSERT ... VALUES(5000001,...) |
+-----------+--------------------------------------------------+
關鍵節點(ID=10001 寫入):
ServerConnection INSERT ... ID=10001RouterUtil try to find cache by primary keyDefaultLayedCachePool create child Cache: TESTDB_ORDER0401 ... size 10000, expire seconds 18000 —— 首次寫入觸發主鍵緩存構建route={ 1 -> dn21{INSERT ...} } rrsNonBlockingSession release connection MySQLConnection[id=8, host=13.217.1.11, port=3317, attachment=dn21{...}]PhysicalDatasource release channel ... modifiedSQLExecuted=false關鍵觀察:範圍分片首次寫入會構建 TableID2DataNodeCache(主鍵→分片映射緩存),後續同主鍵查詢/更新可直接命中緩存,避免重複解析映射文件。
mysql> EXPLAIN SELECT * FROM ORDER0401 WHERE ID=5000001;
+-----------+--------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------+
| dn22 | SELECT * FROM ORDER0401 WHERE ID=5000001 |
+-----------+--------------------------------------------------+
日誌:RouterUtil try to find cache by primary key ... TableID2DataNodeCache.TESTDB_ORDER0401 miss cache, key:5000001 ... route={ 1 -> dn22{...} }
mysql> EXPLAIN SELECT * FROM ORDER0401 WHERE ID < 50000;
+-----------+--------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------+
| dn21 | SELECT * FROM ORDER0401 WHERE ID < 50000 LIMIT 100 |
| dn22 | SELECT * FROM ORDER0401 WHERE ID < 50000 LIMIT 100 |
+-----------+--------------------------------------------------+
mysql> EXPLAIN SELECT * FROM ORDER0401 WHERE SN='shanghai10006_10000';
+-----------+--------------------------------------------------+
| DATA_NODE | SQL |
+-----------+--------------------------------------------------+
| dn21 | SELECT * FROM ORDER0401 WHERE SN='shanghai10006_10000' LIMIT 100 |
| dn22 | SELECT * FROM ORDER0401 WHERE SN='shanghai10006_10000' LIMIT 100 |
+-----------+--------------------------------------------------+
dataNode 定義,執行 reload @@config 生效,無需遷移歷史數據。TableID2DataNodeCache 命中率與大小,必要時調整 size 與 expire seconds。