MySQL查詢提示:
1.LOW_PROPRITY,HIGHT_PRIORITY
作用:指定sql語句的運行優先級,會將加了HIGHT_PROPRITY提示的sql調度到表訪問隊列的最前面
限制:僅對表級別的鎖的引擎有效(MyISAM引擎),對非表級別的引擎的鎖無效,比如innodb引擎
用法:update test LOW_PROPRITY set name = 'abc' where id = 1
2.DELAYED
作用:對於Insert或者replace操作,將待寫入的數據放入緩沖區,待表空閒的時候再做真正的插入
限制:存在丟失數據的風險,並非所有引擎都支持DELAYED 操作,mysql5.7似乎並不支持改操作符
用法:insert DELAYED into test values (1,'aaa')
3.straight_join 強制連接順序
作用:強制連接順序,指定表按照書寫的順序或者前後順序來關聯
限制:
用法:1.select * from t1 a straight_join t2 b on a.id= b.id1 固定t1表和t2 表的關聯順序,
2.select straight_join * from t1 a inner join t2 b on a.id= b.id1 inner join test c on b.id1 = c.id 讓查詢中所有的表按照書寫順序做關聯
4.SQL_SMALL_RESULT 和 SQL_BIG_RESULT
作用:在處理DISTINCT或者GROUP BY的時候,提示優化器按照較小(內存空間)或者較大(磁盤臨時控件)的方式來處理結果集
限制:僅對select 語句有效
用法:select SQL_SMALL_RESULT a.id, count(1) from t1 a straight_join t2 b on a.id= b.id1 group by a.id
5.SQL_BUFFER_RESULT
作用:將查詢結果集放入臨時表,盡快釋放表鎖
限制:
用法:select SQL_BUFFER_RESULT * from testbak
6. SQL_CACHE和SQL_NO_CACHE
作用:告訴查詢引起是否將結果緩存在查詢緩存中
限制:
用法:select SQL_NO_CACHE/*SQL_CACHE*/ * from testbak
7.SQL_CALC_FOUND_ROWS
作用:存在分頁的情況下,提示在計算總行的時候忽略分頁限制
限制:
用法:select SQL_CALC_FOUND_ROWS * from testbak LIMIT 100; --限制為100 頁面
select FOUND_ROWS();--計算上述語句中不加LIMIT 100情況下的總行數
8.FOR UPDATE 和 LOCK IN SHARE MODE
作用:鎖提示
限制:僅INNODB引起支持這兩個提示
用法:select * from testbak where id = 8888 for update
9.USE INDEX,IGNORE INDEX,FORCE INDEX
作用:強制索引提示
用法:select count(1) from testbak USE index(idx_id) ;
select count(1) from testbak IGNORE index(idx_id) ;
select count(1) from testbak FORCE index(idx_id) ;
10. optimizer_search_depth
控制優化器在窮舉執行計劃時的限度,如果查詢長時間處於Statistics狀態,那麼可以考慮調地次參數
optimizer_prune_level
默認打開,讓優化器根據需要掃描的行數來決定是否跳過某些執行計劃
optimizer_switch
包含開啟/關閉優化器特性的標志位
前兩個參數可以讓優化器在生成執行計劃的時候更加靈活,但是有可能錯過一些最優化的執行計劃,
比如優化器要花10秒鐘找一個“最”優化的執行計劃,
但是可以話3秒鐘找一個“次”優化的執行計劃,“次”優化的執行計劃可以在2秒鐘之內完成查詢
這個查詢一共花費了3+2=5秒
但是如果是花10秒鐘找一個“最”優化的執行計劃,最優化的執行計劃需要0.5秒完成查詢
這個查詢一共花費了10+0.5+2=10.5秒,有點得不償失
意思是不要為了找方法而花費的時間超過做事情本身的時間