類似 Oracle Hint,MySQL 提供多種提示語法影響優化器行為,適用於 SQL 調優場景。
| Hint | 語法範例 | 用途 |
|---|---|---|
| FORCE INDEX | SELECT * FROM t FORCE INDEX (idx_col) WHERE col = 1; | 強制使用指定索引 |
| IGNORE INDEX | SELECT * FROM t IGNORE INDEX (idx_a, idx_b) WHERE a = 1; | 禁止使用指定索引 |
| USE INDEX | SELECT * FROM t USE INDEX (idx_c) WHERE c = 1; | 建議使用指定索引(優化器仍可拒絕) |
| SQL_NO_CACHE | SELECT SQL_NO_CACHE * FROM t WHERE id = 1; | 不使用/不存入 Query Cache |
| SQL_CACHE | SELECT SQL_CACHE * FROM t WHERE id = 1; | 明確使用 Query Cache(需 query_cache_type=2) |
| HIGH_PRIORITY | SELECT HIGH_PRIORITY * FROM t; | 提升 SELECT/INSERT 優先級 |
| LOW_PRIORITY | INSERT LOW_PRIORITY INTO t VALUES (...); | 降低 INSERT/UPDATE 優先級,等待讀取完成 |
| DELAYED | INSERT DELAYED INTO t VALUES (...); | 客戶端立即返回,資料寫入記憶體隊列批次寫入 |
| STRAIGHT_JOIN | SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.id = t2.id; | 強制按書寫順序 Join(左表驅動右表) |
| SQL_BUFFER_RESULT | SELECT SQL_BUFFER_RESULT * FROM t WHERE ...; | 結果集寫入臨時表,快速釋放表鎖 |
| SQL_BIG_RESULT | SELECT SQL_BIG_RESULT col, COUNT(*) FROM t GROUP BY col; | 提示結果集大,使用磁盤臨時表排序 |
| SQL_SMALL_RESULT | SELECT SQL_SMALL_RESULT col, COUNT(*) FROM t GROUP BY col; | 提示結果集小,使用記憶體臨時表 |
SQL_NO_CACHE。query_cache_type=2 時,只有加 SQL_CACHE 才會緩存。HIGH_PRIORITY SELECT 會跳過等待表鎖,適合即時儀表板查詢。LOW_PRIORITY INSERT 等待所有讀取釋放鎖後才寫入,適合非即時日誌寫入。SELECT 後加 STRAIGHT_JOIN 或在 FROM 子句中調整表順序並加 Hint。SQL_BUFFER_RESULT,快速釋放鎖,避免長時間阻塞其他查詢。GROUP BY/DISTINCT 可能產生大臨時表時加 SQL_BIG_RESULT 強制用磁盤臨時表,防止記憶體不足。Hint 只是建議,優化器在特定條件下仍可能忽略。生產環境使用前務必在測試環境驗證執行計畫(EXPLAIN)。