資料庫效能優化是系統架構中至關重要的一環。本文從資料庫設計規範、SQL 語句優化、參數配置、硬體資源四大維度,系統梳理 MySQL 優化的核心知識體系,並深入解析 EXPLAIN 執行計畫分析、索引策略、存儲引擎選擇等實戰技巧。
核心在於減少全表掃描、善用索引、避免不必要的排序與臨時表。
重點調整 innodb_buffer_pool_size、query_cache_size、sort_buffer_size 等快取參數,根據記憶體大小合理分配。
SSD 硬碟、充足記憶體、適當的 CPU 核心數,以及 Linux 核心參數調優(如 vm.swappiness、net.core.somaxconn)。
SHOW STATUS LIKE 'Com%' 查看各類 SQL 執行頻率;SHOW GLOBAL STATUS LIKE 'Slow_queries' 監控慢查詢SET GLOBAL slow_query_log=ON;、SET GLOBAL long_query_time=2; 記錄超過 2 秒的查詢pt-query-digest 分析工具鎖定低效語句type、key、rows、Extra 等關鍵欄位CREATE、ALTER、DROPINSERT、DELETE、UPDATESELECTCOMMIT、ROLLBACK、SAVEPOINTGRANT、REVOKE| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | 不支援 | 支援(ACID) |
| 外鍵約束 | 不支援 | 支援 |
| 鎖粒度 | 表鎖 | 行鎖 |
| 檔案結構 | .frm/.MYD/.MYI | .frm + ibdata1 共享表空間 |
| 適用場景 | 讀多寫少、全文搜尋 | 高併發、事務型業務 |
MyISAM 需定期執行 OPTIMIZE TABLE 整理碎片;InnoDB 5.6+ 支援獨立表空間(innodb_file_per_table=ON)。
-- 建立
CREATE INDEX idx_name ON table_name (col1, col2);
ALTER TABLE table_name ADD INDEX idx_name (col1);
-- 刪除
DROP INDEX idx_name ON table_name;
ALTER TABLE table_name DROP INDEX idx_name;
OR 條件未全覆蓋索引LIKE '%keyword' 以萬用字元開頭SHOW STATUS LIKE 'Handler_read%';
-- Handler_read_key 越高越好(索引命中)
-- Handler_read_rnd_next 越高越差(全表掃描)
EXPLAIN SELECT * FROM emp WHERE empno=2000\G;

type:連接類型,效能由好到差:system > const > eq_ref > ref > range > index > ALLpossible_keys:可能用到的索引key:實際使用的索引key_len:索引長度,越短越好rows:預估掃描行數,越少越好Extra:額外資訊
Using index:覆蓋索引,極佳Using where:WHERE 過濾Using filesort:需外部排序,需優化Using temporary:建立臨時表,需優化MyISAM:
ALTER TABLE tbl DISABLE KEYS;
LOAD DATA INFILE ...;
ALTER TABLE tbl ENABLE KEYS;
InnoDB:
-- 1. 按主鍵排序資料
-- 2. 關閉唯一檢查與自動提交
SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;
-- 3. 批次提交
COMMIT;
SELECT * FROM dept GROUP BY ename ORDER BY NULL; -- 禁止隱含排序
每個 OR 條件欄位皆需有索引,否則全表掃描。
高精度場景使用 DECIMAL 避免浮點數誤差。
TIMESTAMP (4 bytes) vs DATETIME (8 bytes),依業務需求選擇最小儲存型別。
MySQL 優化是系統工程,需從設計規範、SQL 品質、索引策略、參數調優、硬體資源多維度協同。建立監控體系,持續追蹤慢查詢,養成 EXPLAIN 先行的開發習慣,才能讓資料庫持續高效穩定運行。