pics,近 100 萬筆資料user_id、picname、smallimgidx_uid (user_id)SELECT picname, smallimg FROM pics WHERE user_id = ?EXPLAIN SELECT SQL_NO_CACHE picname, smallimg FROM pics WHERE user_id = 17853;
結果: 使用 idx_uid,type=ref,rows=估算值,Extra=NULL。平均耗時 40ms。
雖用到索引,但需回表查詢 picname、smallimg,產生額外 I/O。
ALTER TABLE pics ADD INDEX idx_uid_cover (user_id, picname, smallimg);
索引順序遵循:WHERE 條件欄位在前 + SELECT 欄位在後。
EXPLAIN SELECT SQL_NO_CACHE picname, smallimg FROM pics WHERE user_id = 17853;
結果: 使用 idx_uid_cover,Extra=Using index。平均耗時降至 30ms,**提升 25%**。
索引葉子節點已包含查詢所需**所有欄位**,MySQL 僅掃描索引樹即可滿足查詢,**無需回表**存取聚簇索引,大幅減少隨機 I/O。
| 適用 | 不適用 |
|---|---|
| 查詢欄位固定、較少 | SELECT * 或欄位多變 |
| WHERE 條件高選擇性 | 低選擇性(如性別、狀態) |
| 讀多寫少 | 高頻寫入(索引維護成本高) |
SQL_NO_CACHE 測試真實執行時間,排除 Query Cache 干擾Handler_read_next、Innodb_buffer_pool_reads 狀態變量驗證 I/O 降低ANALYZE TABLE 更新統計資訊,確保優化器選擇正確索引