mysqld 單核 CPU 100%。# 利用 parsebinlog 工具(同 GitHub 專案)
./parsebinlog /u1/mysql/logs/mysql-bin.000806
...
Table xx_db.xxtable:
Type DELETE: 101,246
Type INSERT: 103,265
...
單位時間內同一表 DELETE+INSERT > 20 萬行,極大寫入壓力集中在 xx_db.xxtable。
mysql> SHOW ENGINE INNODB STATUS\G
...
---TRANSACTION ..., ACTIVE 3 sec fetching rows
TABLE LOCK table xx_db.xxtable trx id ... lock mode IX
RECORD LOCKS space id 1002 page no 1975 index `AK_movieid` ...
RECORD LOCKS space id 1002 page no 6965 index `GEN_CLUST_INDEX` ...
... (大量 GEN_CLUST_INDEX 記錄鎖)
TOO MANY LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS
關鍵發現:
IX + 大量 GEN_CLUST_INDEX 記錄鎖 → 無顯式主鍵,InnoDB 生成 6 字節隱式主鍵(GEN_CLUST_INDEX)。DELETE+INSERT 混合導致 頁分裂、碎片、鎖競爭,單線程應用極慢。| 因素 | 影響 |
|---|---|
| 無顯式主鍵 | 隱式主鍵全局單調遞增,寫入熱點集中在聚簇索引最右邊頁,極易分裂 |
| 大量 DELETE+INSERT | 留下大量空洞頁,新 INSERT 又在尾部追加,雙重擠壓 |
| 單線程複製 | SQL 線程串行應用,無法利用多核並行消化寫入峰值 |
ALTER TABLE xx_db.xxtable ADD COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
slave_parallel_type=LOGICAL_CLOCK,從根本上並行化 SQL 應用。Handler_read_rnd_next / Innodb_buffer_pool_wait_free:早期發現隱式主鍵熱點。