首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MyCat 連續分片實戰:按日期(天)分片配置與路由分析

     編輯:MySQL 綜合教學

前言

按日期分片是時間序列數據(訂單、日誌、監控指標)最常用的分片策略。MyCat 內建 PartitionByDate 算法,支援按天、月、年等時間粒度將數據均勻分布到不同分片。本文以「從 2016-01-01 起,每 10 天一個分片」為例,完整演示配置、建表、寫入、查詢路由與日誌分析。

一、分片邏輯說明

  • 起始日期:sBeginDate=2016-01-01
  • 分片間隔:sPartionDay=10(每 10 天一個分片)
  • 分片計算:分片號 = floor((目標日期 - 起始日期).days / 10)
  • 擴容注意:需提前規劃足夠分片數,否則超出範圍的日期將路由失敗。

二、配置文件

function.xml

<function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate">
  <property name="dateFormat">yyyy-MM-dd</property>
  <property name="sBeginDate">2016-01-01</property>
  <property name="sPartionDay">10</property>
</function>

<tablerule name="sharding-by-date-tr04">
  <rule>
    <columns>CREATE_TIME</columns>
    <algorithm>sharding-by-date</algorithm>
  </rule>
</tablerule>

schema.xml

<table name="ORDER0402" rule="sharding-by-date-tr04"/>

三、建表與寫入驗證

CREATE TABLE ORDER0402(
  ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  PROVINCE VARCHAR(16),
  SN VARCHAR(64),
  CREATE_TIME DATETIME
);

測試數據

-- 2016-01-03 屬於第 0 個 10 天區間 → dn21
INSERT INTO ORDER0402(ID,PROVINCE,SN,CREATE_TIME)
VALUES(10001,'shanghai','shanghai10006_2016-01-03','2016-01-03');

-- 2016-01-13 屬於第 1 個 10 天區間 → dn22
INSERT INTO ORDER0402(ID,PROVINCE,SN,CREATE_TIME)
VALUES(5000001,'shanghai','shanghai10006_2016-01-13','2016-01-13');

EXPLAIN 驗證

mysql> EXPLAIN INSERT ... VALUES(10001,...,'2016-01-03');
+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn21      | INSERT ... VALUES(10001,...,'2016-01-03')        |
+-----------+--------------------------------------------------+

mysql> EXPLAIN INSERT ... VALUES(5000001,...,'2016-01-13');
+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn22      | INSERT ... VALUES(5000001,...,'2016-01-13')      |
+-----------+--------------------------------------------------+

四、寫入路由日誌分析

關鍵節點(以 2016-01-13 寫入為例):

  1. ServerConnection INSERT ... CREATE_TIME='2016-01-13'
  2. route={ 1 -> dn22{INSERT ...} } 直接命中 dn22
  3. NonBlockingSession release connection MySQLConnection[id=17, host=13.23.1.11, port=3327, attachment=dn22{...}]
  4. PhysicalDatasource release channel ... modifiedSQLExecuted=false

日期分片同樣屬於單點直連路由,無緩存構建開銷。

五、查詢路由行為

1. 精確日期查詢 → 單節點

mysql> EXPLAIN SELECT * FROM ORDER0402 WHERE CREATE_TIME='2016-01-03';
+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn21      | SELECT * FROM ORDER0402 WHERE CREATE_TIME='2016-01-03' LIMIT 100 |
+-----------+--------------------------------------------------+

日誌:SQLRouteCache add cache ... route={ 1 -> dn21{...} }

2. 日期範圍查詢 → 全節點

mysql> EXPLAIN SELECT * FROM ORDER0402 WHERE CREATE_TIME<'2016-01-04';
+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn21      | SELECT * FROM ORDER0402 WHERE CREATE_TIME<'2016-01-04' LIMIT 100 |
| dn22      | SELECT * FROM ORDER0402 WHERE CREATE_TIME<'2016-01-04' LIMIT 100 |
+-----------+--------------------------------------------------+

即使數據僅在 dn21,範圍條件導致廣播查詢。

3. 非分片字段查詢 → 全節點

mysql> EXPLAIN SELECT * FROM ORDER0402 WHERE SN='shanghai10006_2016-01-03';
+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn21      | SELECT * FROM ORDER0402 WHERE SN='shanghai10006_2016-01-03' LIMIT 100 |
| dn22      | SELECT * FROM ORDER0402 WHERE SN='shanghai10006_2016-01-03' LIMIT 100 |
+-----------+--------------------------------------------------+

六、運維建議

  • 預分片規劃:根據業務增長預估未來 1-2 年所需分片數,一次性在 schema.xml 定義足夠的 dataNode。
  • 歷史數據歸檔:舊分片可遷移至廉價存儲或只讀實例,減少主庫壓力。
  • 跨分片查詢優化:業務層盡量按日期精確查詢;必須跨分片時,考慮彙總表或異構索引(ES/ClickHouse)。
  • 時區一致性:應用層、MyCat、後端 MySQL 統一使用 UTC 或固定時區,避免日期邊界計算偏差。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved