MySQL 作為最流行的開源關係型資料庫,其效能優化始終是後端開發與運維的核心課題。本文系統梳理 MySQL 效能瓶頸的四大根因——索引缺失、SQL 寫法不當、配置錯誤、硬體資源不足,並給出從單機調優到架構擴展的完整實戰方案。
/usr/local/mysql/bin/mysql -hlocalhost -uroot -p
輸入密碼後執行 show full processlist,建議連續執行數次。重點關注欄位:
Locked、Sending data、Sorting result健康的快取後端應幾乎看不到活躍查詢;若持續看到大量 SQL,效能問題已經存在。
Time 巨大的語句。重點三欄:
NULL 代表全表掃描Using filesort、Using temporary 即為效能殺手場景:SELECT * FROM imgs WHERE userid='admin' ORDER BY clicks DESC LIMIT 10
| 階段 | 索引 | type | rows | Extra | 說明 |
|---|---|---|---|---|---|
| 初始 | 無 | ALL | 12,506 | Using where; Using filesort | 全表掃描 + 檔案排序 |
| 加 userid 索引 | userid | ref | 2,944 | Using where; Using filesort | 縮小範圍但仍需排序 |
| 強制用 clicks 索引 + 條件過濾 | clicks | range | 312 | Using where | 需人工調整閾值,維護成本高 |
| 建立聯合索引 (userid, clicks) | userid_clicks | ref | 2,944 | Using where | 最佳:索引已按 clicks 排序,消除 filesort |
關鍵洞見:聯合索引 (userid, clicks) 同時滿足「過濾」與「排序」,MySQL 直接按索引順序取前 10 行,無需額外排序。
LIMIT 100000, 10 會掃描前 10 萬行再丟棄,隨偏移量增大線性變慢。業界常見對策:
WHERE id > last_id LIMIT 10)涉及 GROUP BY、多表 JOIN 時同樣用 EXPLAIN 檢視 type、key、Extra;善用 STRAIGHT_JOIN、USE INDEX 引導優化器。
| 參數 | 建議值 | 說明 |
|---|---|---|
| key_buffer_size | 128M~25% | 索引緩衝,視實際索引總量調整 |
| sort_buffer_size | 2M~8M | 每線程排序緩衝,過大反增 CPU 開銷 |
| thread_concurrency | CPU 核心數 × 2 | 僅 Solaris 生效,Linux 忽略 |
| wait_timeout / interactive_timeout | 30~60 | 快速回收閒置連線 |
| query_cache_type | OFF (0) | 寫入頻繁系統會成瓶頸,唯獨讀庫可開 |
| max_connections | 400~600 | 超過 600 需架構擴展而非單純加大 |
原則:配置優化是輔助,索引與 SQL 才是主戰場;穩定性與資料正確性永遠優先於效能。
long_query_time=1)SELECT *、隱式類型轉換、函數操作索引列MySQL 優化是系統工程,沒有銀彈,只有持續觀測、假設驗證、迭代優化。願本文能成為你排查效能問題時的得力參考。