LockedSending data,阻塞其他所有連線MyISAM 只支援表級鎖:
SELECT → 共享讀鎖(可並發讀,阻塞寫)INSERT/UPDATE/DELETE → 獨佔寫鎖(阻塞所有讀寫)InnoDB 支援行級鎖,但以下情況仍會退化:
-- 1. 查看當前進程
SHOW FULL PROCESSLIST;
-- 2. 查看鎖等待 (MySQL 5.7+)
SELECT * FROM sys.schema_table_lock_waits;
SELECT * FROM sys.innodb_lock_waits;
-- 3. 查看 InnoDB 引擎狀態
SHOW ENGINE INNODB STATUS\G
-- 關注 TRANSACTIONS 區塊:LOCK WAIT、等待時間、持有鎖的 SQL
-- 4. 慢查詢日誌分析
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
-- 使用 pt-query-digest 分析
| 問題 | 優化手段 |
|---|---|
| 全表掃描 | 加上 WHERE 條件欄位索引、覆蓋索引 |
| 索引失效 | 避免函數運算、隱式轉換、LIKE '%...'、OR 破壞索引 |
| 大事務 | 拆分小事務、減少鎖持有時間、避免事務中 RPC 呼叫 |
| 深分頁 | 延遲關聯、游標分頁、禁止 OFFSET 1000000 |
| 複雜 JOIN | 確保 JOIN 欄位有索引、小表驅動大表、Redundant 索引清理 |
[mysqld]
# 連線層
max_connections = 2000
thread_cache_size = 100
back_log = 500
wait_timeout = 7200
interactive_timeout = 7200
# InnoDB 核心
innodb_buffer_pool_size = 60%_physical_ram
innodb_buffer_pool_instances = 8
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 50
innodb_deadlock_detect = ON
# 查詢快取 (5.7 建議關閉,8.0 已移除)
query_cache_type = 0
query_cache_size = 0
# 表快取
table_open_cache = 4000
table_definition_cache = 2000
# 臨時表
tmp_table_size = 256M
max_heap_table_size = 256M
# 排序/連接緩衝 (per thread, 慎調)
sort_buffer_size = 4M
read_buffer_size = 2M
join_buffer_size = 4M
read_rnd_buffer_size = 4M
若仍在使用 MyISAM 遇到鎖爭用,**強烈建議遷移至 InnoDB**:
ALTER TABLE table_name ENGINE=InnoDB;
遷移注意:COUNT(*) 無 WHERE 時 InnoDB 需掃描,建議維護計數表或使用 EXPLAIN 估算行數。
| 指標 | 告警閾值 | 含義 |
|---|---|---|
| Threads_connected / max_connections | > 80% | 連線池耗盡風險 |
| Innodb_row_lock_waits | 持續增長 | 鎖等待頻發 |
| Innodb_row_lock_time_avg | > 50ms | 平均鎖等待過長 |
| Slow_queries | > 0/min | 慢查詢產生 |
| Table_locks_waited / Table_locks_immediate | > 1% | MyISAM 表鎖爭用 |