現今,開發者廣泛採用 LAMP(Linux、Apache、MySQL、PHP/Perl)架構構建應用。然而,系統管理員往往無法控制應用代碼本身,只能從服務器配置層面入手提升性能。本文作為系列文章的最後一部分,聚焦於數據庫層的調優策略,助您榨乾 MySQL 性能。
提升 MySQL 速度有三大途徑,效能遞增順序為:
注意:即使硬件強勁、查詢優秀,若 mysqld 配置不當,高併發下仍會因忙於雜務而無法服務核心查詢。
全表掃描會消耗大量磁盤 I/O,尤其在連接查詢中更顯著。執行時間超過閾值的語句即為「慢查詢」。
在 my.cnf 的 [mysqld] 區塊添加:
[mysqld]
log-slow-queries
long_query_time = 5
log-queries-not-using-indexes
以上配置記錄耗時超過 5 秒及未使用索引的查詢(需 MySQL 4.1+)。日誌默認存放於數據目錄的 hostname-slow.log。分析日誌請使用 mysqldumpslow 命令,它會自動歸一化參數,聚合同類查詢,快速定位最高頻的性能瓶頸。
許多 LAMP 應用反覆執行相同 SELECT。MySQL 查詢緩存可將結果集存入內存,命中時直接返回,省去解析、優化、磁盤讀取全流程。默認關閉,啟用方法:
query_cache_size = 32M
啟用後需監控效果,關鍵狀態變量:
Qcache_hits / Qcache_inserts → 命中率(示例中約 87%)Qcache_lowmem_prunes 持續增長 → 內存不足或碎片嚴重Qcache_free_blocks 過多 → 需 FLUSH QUERY CACHE 整理碎片避坑指南:緩存過大反而拖累維護開銷;若 FLUSH QUERY CACHE 耗時過長,說明尺寸超標。
max_connections = 500
wait_timeout = 10
max_connect_errors = 100
max_connections:類比 Apache MaxClients,防連接數失控。可用 SHOW STATUS LIKE 'max_used_connections' 觀察峰值。wait_timeout:10 秒斷開空閒連接,釋放連接表槽位。持久連接或高併發場景慎用過小值。max_connect_errors:提高到 100 給服務器喘息機會,避免誤封合法主機。MySQL 超過 100 個可調參數,掌握核心幾個即可覆蓋 90% 場景。原則:總內存佔用不超物理內存,需權衡妥協。
| 緩存 | 監控指標 | 調優建議 |
|---|---|---|
表緩存 (table_cache) |
Open_tables 接近上限、Opened_tables 快速增長 |
增大 table_cache(如 5000),但避免過度浪費文件描述符 |
線程緩存 (thread_cache) |
Threads_created 快速增長 |
設 thread_cache = 40 等,減少頻繁創建銷毀開銷 |
鍵緩衝區 (key_buffer) |
Key_reads / Key_read_requests > 1/1000 |
增大至 384M 等,讓索引塊盡量在內存命中 |
臨時表 (tmp_table_size, max_heap_table_size) |
Created_tmp_disk_tables / Created_tmp_tables 比率高 |
同步調大兩參數,盡量讓臨時表留在內存 |
sort_buffer_size):Sort_merge_passes 大 → 設 4Mread_buffer_size):Handler_read_rnd_next / Com_select > 4000 → 設 4M,超 8M 需聯動開發優化 SQLtop,實時查看連接、查詢、緩存命中率,秒級定位惡意查詢。MySQL 調優非一蹴而就,而是「監控 → 發現瓶頸 → 調整參數 → 驗證效果」的持續循環。善用慢查詢日誌與查詢緩存,合理配置各層級緩沖區,輔以專業工具觀測,即可在不換硬件、不改代碼前提下,大幅提升 LAMP 架構的數據庫吞吐能力。