MySQL數據庫支持索引提示(INDEX HINT)顯式的高速優化器使用了哪個索引。以下是可能需要用到INDEX HINT的情況
a)MySQL數據庫的優化器錯誤的選擇了某個索引,導致SQL運行很慢。這個在最新版的數據庫版本中非常少見。優化器在絕大部分情況下工作的非常有效和正確。
b)某些SQL語句可以選擇的索引非常多,這時優化器選擇執行計划時間的開銷可能會大於SQL語句本身例如優化器分析Range查詢本身就是比較耗時的操作。這時DBA或開發人員分析最優的索引選擇,通過index hint來強制使優化器不進行各個路徑的成本分析直接選擇指定的索引來完成查詢
MySQL數據庫的Index Hint語法
看個表結構
CREATE TABLE t( a INT, b INT, KEY(a), KEY(b) )ENGINE=INNODB; INSERT INTO t SELECT 1,1; INSERT INTO t SELECT 1,2; INSERT INTO t SELECT 2,3; INSERT INTO t SELECT 2,4; INSERT INTO t SELECT 1,2;
查看執行計划
如圖SQL語句可以使用a,b索引,實際使用的索引為b,a完成整個查詢,列Extra提示Using intersect(b,a)表示根據兩個索引得到的結果進行求交的數學運算,最后得到結果
如果我們使用USE INDEX 的索引來使用a這個索引呢
EXPLAIN SELECT * FROM t USE INDEX(a) WHERE a=1 AND b=2;
可以發現,優化器使用了a的索引,但use index只是告訴優化器可以選擇該索引,實際上優化器還是會根據自己的判斷進行選擇,最可靠的做法是FORCE INDEX