目錄
8、在 where 子句中對字段進行表達式操作,是不會導致全表掃描。不過查詢速度會變慢,所以盡量避免使用。
9、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。
10.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:(一般開發也不會這么無聊啦,在正式的項目上寫這種玩意)
項目背景
有三張百萬級數據表
知識點表(ex_subject_point)9,316條數據
試題表(ex_question_junior)2,159,519條數據 有45個字段
知識點試題關系表(ex_question_r_knowledge)3,156,155條數據
測試數據庫為:mysql (5.7)
?
7、在 where 子句中使用參數,是不會導致全表掃描。
案例分析
?
?
8、在 where 子句中對字段進行表達式操作,是不會導致全表掃描。不過查詢速度會變慢,所以盡量避免使用。
案例分析
?
執行時間是1.064s
優化方案
SELECT ex_question_junior.QUESTION_ID
FROM ex_question_junior
WHERE ex_question_junior.QUESTION_CHANNEL_TYPE =4/2;
執行時間是0.012s
?
?
?
9、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。
案例分析
?
優化方案
SELECT *
FROM ex_subject_point
WHERE CREATE_DT >= "2018-05-31"
AND CREATE_DT < "2018-07-01"
但是EXPLAIN一下,發現這樣還是全表掃描的
?
難道是因為日期字段索引沒有效果嗎?還是因為用了>=和<運算符號?
來驗證一下
縮小查詢范圍,發現索引是有效果的。所以不是日期字段的問題。
換個字段查詢,用>=和<運算符號,索引還是有效果的。但那是什么原因呢?
后來去網上查找了資料,原因是查詢數量是超過表的一部分,mysql30%,oracle 20%(這個數據可能不準確,不是官方說明,僅供參考),導致索引失效。
10.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
例子請看第8點和第9點。
11.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用(這個在mysql中不對),并且應盡可能的讓字段順序與索引順序相一致。
案例分析
復合索引字段:PATH,PARENT_POINT_ID
?
?
?
調換WHERE子句中的條件順序。發現還是可以使用索引的
復合索引只查詢第一個字段,是有效果的
?
復合索引只查詢第二個字段,發現索引沒有效果了。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:(一般開發也不會這么無聊啦,在正式的項目上寫這種玩意)
select col1,col2 into #t from t where
1
=
0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(…)
參考:
https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd
***************************************************************************
作者:小虛竹
歡迎任何形式的轉載,但請務必注明出處。
限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。
?
我不是個偉大的程序員,我只是個有著一些優秀習慣的好程序員而己
?
?
?
?
?
本文摘自 :https://blog.51cto.com/u