單表資料量過大(如億級)會導致查詢、索引維護、備份恢復效能急劇下降。Hash 分表將資料按某欄位(如 forum_id)經雜湊函數映射到固定數量的子表中,實現資料均勻分佈與水平擴展。
function get_hash($id) {
$str = bin2hex((string)$id); // 轉十六進位字串
$hash = substr($str, 0, 4); // 取前 4 字元
if (strlen($hash) < 4) {
$hash = str_pad($hash, 4, '0', STR_PAD_RIGHT); // 不足補 0
}
return $hash; // 如 '3100', '3233'
}
topic_{hash} → topic_3100reply_{hash} → reply_3100同一 forum_id 的主題與回覆落在同組表,便於關聯查詢。
| 參數 | 值 |
|---|---|
| 預估總資料量 | 1 億筆 |
| 單表容量上限 | 100 萬筆 |
| 所需子表數 | 100 張 |
| Hash 空間 | 4 位十六進位 = 65,536 個桶(足夠) |
不同 forum_id 可能映射到同一張表(Hash 碰撞),這在分表場景下不需解決,只需確保單表不超容量上限。
forum_id(數字、唯一、分佈均勻)應用層封裝 getTableName($forum_id, 'topic'),業務代碼無感知,避免 SQL 硬編碼。
Hash 分表實作簡單、路由確定性強、無需中間件,適合中小規模水平擴展。核心在於選好分片鍵、設計好 Hash 函數、封裝路由邏輯。大規模場景建議引入 ShardingSphere、Vitess 等中間件。