首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現億級資料分表 100 張表至 MySQL

     編輯:PHP 相關知識

PHP 實現億級資料分表 100 張表至 MySQL

面對億級資料量,單表查詢效能急劇下降。本文示範如何用 PHP 建立 100 張分表、以 CRC32 雜湊演算法分配資料、再利用 MERGE 儲存引擎提供統一查詢入口,實現水平分表架構。

1. 批次建立 100 張分表

$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++;
}

2. 分表雜湊路由函數

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。

3. 建立 MERGE 總表統一查詢

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 引擎有已知限制(如無法支援外鍵、替換表結構需重建)
分表邏輯簡單,易於維護 資料遷移與重新分表成本高

進階建議

  • 生產環境建議使用 InnoDB + 分區表 或中間件
  • 分表鍵選擇需考慮查詢模式,避免熱點
  • 搭配讀寫分離、快取層進一步提升效能

此方案適合中小型團隊快速落地億級資料分表,作為架構演進的過渡方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved