在高併發的資料庫驅動應用中,一條糟糕的 SQL 可能拖垮整個系統。優化不僅是加速單一查詢,更是保障整體資源公平分配、避免鎖爭用與連線耗盡。MySQL 內建工具讓我們能科學地定位瓶頸,而非憑直覺試錯。
CREATE INDEX idx_username ON users(username);
SHOW INDEX FROM users;
關鍵權衡:
WHERE、JOIN、ORDER BY、GROUP BYINSERT/UPDATE/DELETE 需同步維護索引結構 (B+ 樹分裂/合併)最佳實務:
user_id、emailgender、status) 單獨建索引ANALYZE TABLE 更新統計資訊,確保優化器決策準確EXPLAIN 顯示 MySQL 如何執行查詢:掃描類型、可能/實際用索引、預估掃描行數、額外操作 (Using where/temporary/filesort 等)。
原始查詢 (掃描 city 全表 4079 列):
EXPLAIN SELECT city.name, city.district
FROM city, country
WHERE city.countrycode = country.code AND country.code = 'IND';
輸出關鍵欄位:
| table | type | possible_keys | key | rows | Extra |
|---|---|---|---|---|---|
| country | const | PRIMARY | PRIMARY | 1 | Using index |
| city | ALL | NULL | NULL | 4079 | Using where |
優化動作:在 city.countrycode 建索引
CREATE INDEX idx_ccode ON city(countrycode);
優化後 EXPLAIN:
| table | type | key | rows | Extra |
|---|---|---|---|---|
| country | const | PRIMARY | 1 | Using index |
| city | ref | idx_ccode | 333 | Using where |
🎯 掃描行數從 4079 降至 333,**效能提升 92%**!
核心參數 (以 InnoDB 為例):
| 參數 | 建議值 | 說明 |
|---|---|---|
| innodb_buffer_pool_size | 實體記憶體 60-80% | 資料/索引快取核心,越大越好 |
| innodb_log_file_size | 256M - 1G | 減少 checkpoint 頻率,提升寫入 |
| innodb_flush_log_at_trx_commit | 2 (高效能) / 1 (ACID) | 1=每次提交刷盤;2=每秒刷盤 |
| max_connections | 應用峰值 + 緩衝 | 避免「Too many connections」 |
| query_cache_type/size | 0 / 0 (MySQL 5.7+ 建議關閉) | 高併發下鎖爭用嚴重,8.0 已移除 |