「PHP 腳本 80% 時間在等待 MySQL」——這句經典話語道出了數據庫優化的核心地位。MySQL 優化是一個系統工程,涉及**架構設計、實例配置、SQL 與索引、操作系統、硬件**五個維度。本文結合生產實踐,構建從「查緩存」到「調參數」再到「改 SQL」的完整優化知識體系。
參考文章 91368 詳細配置模板,此處列出**調優邏輯**而非死記數值:
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests 命中率 > 99%。Max_used_connections 峰值留 20% 余量。Threads_created/Connections < 1% (見 91369)。validateQuery 防空閒斷連。| 參數 | 建議範圍 | 調大時機 |
|---|---|---|
| sort_buffer_size | 256K - 2M | 大量 ORDER BY / GROUP BY 且無法用索引排序時,Session 級臨時 SET 更大 |
| read_buffer_size | 128K - 2M | 全表掃描大表時 |
| join_buffer_size | 256K - 2M | 無索引 Join (應優先加索引而非調大) |
| read_rnd_buffer_size | 256K - 1M | 排序後按主鍵回表讀取 |
Created_tmp_disk_tables / Created_tmp_tables < 10%。Qcache_lowmem_prunes。Open_tables 接近上限且 Opened_tables 持續增長時調大。受 open_files_limit 制約。slow_query_log=1, long_query_time=0.5 (秒), log_queries_not_using_indexes=1。EXPLAIN SELECT * FROM orders WHERE user_id=100 AND status=1 ORDER BY create_time DESC LIMIT 10;
關鍵列解讀:
key=NULL 即未命中。Using index (覆蓋索引、極好)、Using where、Using filesort (需優化排序)、Using temporary (臨時表、需優化)。(a,b,c) 支持 a, a,b, a,b,c 查詢。COUNT(DISTINCT col)/COUNT(*) > 0.1 適合建索引。(a) 和 (a,b) 共存,前者多餘。| 反模式 | 優化方案 | 原理 |
|---|---|---|
SELECT * | 指定列 | 減少網絡/IO/內存,利用覆蓋索引 |
WHERE YEAR(create_time)=2024 | WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01' | 函數導致索引失效,範圍查詢走索引 |
WHERE amount/7 > 100 | WHERE amount > 700 | 列運算導致索引失效,移項常數 |
LIKE '%keyword%' | 全文索引 / ES / 前綴 LIKE 'keyword%' | 前導通配符不可用索引 |
NOT IN / NOT EXISTS 子查詢 | LEFT JOIN ... WHERE t2.id IS NULL 或 NOT EXISTS (SELECT 1 ...) | 子查詢優化器處理差,Join/半連接更穩 |
ORDER BY RAND() LIMIT 10 | 應用層隨機 ID / 覆蓋索引掃描 | 全表排序極慢 |
隱式類型轉換 WHERE phone=13800000000 (phone 是 varchar) | WHERE phone='13800000000' | 轉換導致索引失效 |
| 工具 | 用途 | 特點 |
|---|---|---|
| Prometheus + Grafana + mysqld_exporter | 全方位監控大盤 | 標準化、告警、歷史趨勢 |
| Percona Toolkit (pt-query-digest, pt-online-schema-change, pt-table-checksum) | 慢查詢分析、在線 DDL、主從一致性校驗 | DBA 必裝瑞士軍刀 |
| MySQLTuner.pl / MySQLTuner-perl | 配置快速體檢 | 參考建議,**不可盲目執行** |
| sysbench | 基準壓測 | OLTP/只讀/寫入混合場景 |
| Performance Schema / Sys Schema (5.7+) | 內核級儀表盤 | 等待事件、內存、鎖、語句統計零侵入 |