為何索引是優化首選?
索引是加速查詢最有效工具。無索引時 MySQL 掃描全表(O(N)),有索引則快速定位(O(log N)),百萬行資料可快 100 倍以上。優化優先順序:先建索引,再調其他。
單表查詢中的索引效應
以 student 表為例,查詢 english < 60:
- 無索引:全表掃描每一列比對。
- 建立
INDEX(english):索引檔依分數排序,掃描至 66 即可停止,僅讀 5 筆符合列 + 1 筆邊界列。
- 結果自動按索引鍵排序輸出。
多表連接查詢的索引威力
三表 t1, t2, t3 各 1,000 行,連接查詢:
- 無索引:笛卡兒積 10 億組合,極慢。
- 有索引:掃描 t1(1,000 行),利用 t2、t3 索引直接跳轉匹配行,快百萬倍。
多欄索引(複合索引)設計原則
- 建立
INDEX(col1, col2) 可支援 WHERE col1=... AND col2=... 及 WHERE col1=...(最左前綴原則)。
- 若查詢
WHERE col2=... 或 WHERE col2=... AND col3=...,無法使用 (col1,col2,col3) 索引,因非最左前綴。
- 分開單欄索引時,優化器選擇選擇性最高(過濾行最少)者。
LIKE 查詢與索引的關係
| 模式 | 是否用索引 | 說明 |
LIKE 'Patrick%' | ✅ | 常數前綴,範圍掃描 |
LIKE 'Pat%_ck%' | ✅ | 前綴常數 |
LIKE '%Patrick%' | ❌ | 前導萬用字元 |
LIKE other_col | ❌ | 非常數 |
其他索引使用條件
- 比較運算子:
=, >, >=, <, <=, BETWEEN 可用索引。
IS NULL 於索引欄位可用索引。
- 多欄索引需在
WHERE 所有 AND 層級使用最左前綴才會被採用。
常見錯誤 WHERE 範例
-- 使用索引
WHERE index_part1=1 AND index_part2=2
WHERE index=1 OR index=2 -- 優化器轉換為 index IN (1,2)
-- 不使用索引
WHERE index_part2=1 AND index_part3=2 -- 缺最左欄位
WHERE index=1 OR A=10 -- 無索引跨越所有行
WHERE index_part1=1 OR index_part2=10 -- OR 導致全掃描
實戰建議
- 依查詢模式建立複合索引,遵循最左前綴。
2. 避免在索引欄位上使用函數或運算(如 WHERE YEAR(date_col)=2023),改用範圍查詢。
3. 定期 ANALYZE TABLE 更新統計資訊,協助優化器決策。
4. 監控 Handler_read_key / Handler_read_rnd_next 比值評估索引命中率。
- 上一篇文章: MySQL 企業版重大更新:內建 Query Analyzer 查詢分析器,秒級定位效能瓶頸
- 下一篇文章: MySQL 查詢性能優化指南:善用 EXPLAIN 分析執行計畫
Copyright ©
程式碼之家 All Rights Reserved