面對億級資料量,單表查詢效能急劇下降。本文示範如何用 PHP 建立 100 張分表、以 CRC32 雜湊演算法分配資料、再利用 MERGE 儲存引擎提供統一查詢入口,實現水平分表架構。
$i = 0;
while ($i <= 99) {
$sql = "CREATE TABLE `code_$i` (
`full_code` char(10) NOT NULL,
`create_time` int(10) unsigned NOT NULL,
PRIMARY KEY (`full_code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
mysql_query($sql);
$i++;
}
function get_hash_table($table, $code, $s = 100) {
$hash = sprintf("%u", crc32($code));
$hash1 = intval(fmod($hash, $s));
return $table . "_" . $hash1;
}
// 使用範例
$table_name = get_hash_table('code', $full_code);
// 插入資料前先取得目標表名
// INSERT INTO `$table_name` ...
原理:crc32 產生 32 位無號整數,對 100 取模,均勻分布到 code_0 ~ code_99。
CREATE TABLE IF NOT EXISTS `code` (
`full_code` char(10) NOT NULL,
`create_time` int(10) unsigned NOT NULL,
INDEX(full_code)
) TYPE=MERGE UNION=(code_0,code_1,code_2,...,code_99) INSERT_METHOD=LAST;
此後可直接對 code 表進行 SELECT、INSERT(寫入最後一張表)操作,MySQL 會自動路由至對應分表。
| 優點 | 缺點 |
|---|---|
| 單表資料量降低,索引更小,查詢更快 | 跨分表 JOIN、事務處理複雜 |
| MERGE 表提供透明查詢介面 | MERGE 引擎有已知限制(如無法支援外鍵、替換表結構需重建) |
| 分表邏輯簡單,易於維護 | 資料遷移與重新分表成本高 |
此方案適合中小型團隊快速落地億級資料分表,作為架構演進的過渡方案。