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

PHP MySQL 分表策略實戰:按 ID 取模、合併查詢表、自增 ID 產生器

     編輯:PHP 綜合知識

分表觸發條件

單表超過 100 萬筆 時,查詢效能明顯下降,應考慮分表或分區。

按 ID 尾數取模分表(10 表)

建立 article_0 ~ article_9,結構完全一致(含主鍵、型別、順序),ID 不設自增。

建立 MERGE 合併查詢表

CREATE TABLE `article` (
    `id` BIGINT(20) NOT NULL,
    `subject` VARCHAR(200) NOT NULL,
    `content` TEXT NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8
INSERT_METHOD=0
UNION=(`article_0`,`article_1`,...`article_9`);
  • ENGINE=MRG_MyISAM:MyISAM 合併引擎
  • INSERT_METHOD=0:禁止直接插入合併表,僅供 SELECT
  • 所有子表結構必須完全一致

自增 ID 產生器表

CREATE TABLE `create_id` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=MyISAM;

PHP 插入邏輯

function getNextId() {
    $this->db->query("INSERT INTO create_id (id) VALUES ('')");
    return $this->db->insertID();
}

function getTableName($id) {
    return 'article_' . ($id % 10);
}

function insertArticle($subject, $content) {
    $id = $this->getNextId();
    $table = $this->getTableName($id);
    $sql = "INSERT INTO {$table} (id, subject, content) VALUES (?, ?, ?)";
    $this->db->query($sql, [$id, $subject, $content]);
    return $id;
}

查詢、更新、刪除

  • 查詢: 直接操作 article 合併表
  • 更新/刪除: 先算 $table = getTableName($id),再操作對應子表

其他分表策略

遷移與擴容建議

  • 雙寫過渡期:新舊結構同寫,驗證無誤再切換讀取
  • 擴容時採用一致性雜湊或預留表編號,避免大量遷移
  • 考慮中間件(MyCat、ShardingSphere、Vitess)自動化分片
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略適用場景範例
時間分表日誌、訂單、流水orders_2024_01, orders_2024_02
用戶 ID 取模用戶資料、關係表user_0 ~ user_99
地區/租戶多租戶、地理分片data_tw, data_hk, data_us
MD5 雜湊取位需大量分表、均勻分布substr(md5($key), 0, 2) → 256 表