單表超過 100 萬筆 時,查詢效能明顯下降,應考慮分表或分區。
建立 article_0 ~ article_9,結構完全一致(含主鍵、型別、順序),ID 不設自增。
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:禁止直接插入合併表,僅供 SELECTCREATE TABLE `create_id` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=MyISAM;
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),再操作對應子表| 策略 | 適用場景 | 範例 |
|---|---|---|
| 時間分表 | 日誌、訂單、流水 | orders_2024_01, orders_2024_02 |
| 用戶 ID 取模 | 用戶資料、關係表 | user_0 ~ user_99 |
| 地區/租戶 | 多租戶、地理分片 | data_tw, data_hk, data_us |
| MD5 雜湊取位 | 需大量分表、均勻分布 | substr(md5($key), 0, 2) → 256 表 |