在高併發的數據庫驅動應用中,一條糟糕的 SQL 能拖垮整個系統:不僅消耗大量數據庫資源,還會連帶影響其他業務組件。優化查詢性能很大程度上依賴開發者的經驗直覺,但 MySQL 內建了強大的輔助工具。本文聚焦三大核心手段:索引設計、EXPLAIN 執行計劃分析、關鍵參數調優。
CREATE INDEX idx_username ON users(username);
為 WHERE 或 HAVING 條件中常用的列建立索引,可避免全表掃描,大幅提升查詢速度。每張表最多支持 16 個索引,亦支援多列索引與全文索引。
SHOW INDEX FROM users;
INSERT/UPDATE/DELETE 都需維護索引結構,索引過多會拖慢寫入。EXPLAIN 放在 SELECT 前,可輸出 MySQL 如何執行查詢、預估掃描行數、使用的索引等關鍵信息。
優化前:
EXPLAIN SELECT city.name, city.district
FROM city, country
WHERE city.countrycode = country.code AND country.code = 'IND';
-- city 表 type=ALL,掃描 4079 行
添加索引後:
CREATE INDEX idx_ccode ON city(countrycode);
優化後:
EXPLAIN SELECT city.name, city.district
FROM city, country
WHERE city.countrycode = country.code AND country.code = 'IND';
-- city 表 type=ref,掃描 333 行,減少 90%+
關鍵列解讀:
type:const > ref > range > index > ALL(越靠前越好)rows:預估掃描行數,越小越好key:實際使用的索引Extra:Using index(覆蓋索引)、Using where、Using temporary 等提示| 變量 | 作用 | 建議值 |
|---|---|---|
key_buffer_size | 索引緩衝區大小(MyISAM 核心參數) | 物理內存 25% 左右 |
read_buffer_size | 全表掃描時的順序讀緩衝區 | 視頻掃描慢則適當調大 |
table_cache / table_open_cache | 可同時打開的表數量 | 配合 max_connections 適當調大 |
long_query_time | 慢查詢日誌閾值(秒) | 1~2 秒,用於定位低效 SQL |