用戶表 members 單表過大,查詢效能瓶頸。採用**分表**策略:按 mid % 100 拆分為 members_00 ~ members_99 共 100 張結構相同的表。
";
// 分批寫入,避免單次事務過大
echo "INSERT INTO members_{$i} SELECT * FROM members WHERE mid % 100 = {$i} LIMIT 50000;
";
}
?>
LIMIT 50000 寫入,控制事務大小、減少鎖持有時間。同樣是 members 表,需調整結構(如刪減冗餘欄位、調整索引),且不能停機。
CREATE TABLE members_tmp LIKE members;ALTER TABLE members_tmp ...(加/減欄位、調索引、改型別)。INSERT ... SELECT 將舊資料導入 members_tmp(可併發多線程跑)。members_tmp。RENAME TABLE members TO members_bak, members_tmp TO members;
RENAME TABLE 是原子操作,僅持有極短元資料鎖,業務幾乎無感知。DROP TABLE members_bak。RENAME 瞬間極短鎖定。RENAME TABLE 雖快,但會阻塞所有對該表的 DML,選擇低峰期執行。mid % 100),或使用中間件(ShardingSphere、MyCat、Vitess)。