有三張百萬級數據表 知識點表(ex_subject_point)9,316條數據 試題表(ex_question_junior)2,159,519條數據 有45個欄位 知識點試題關係表(ex_question_r_knowledge)3,156,155條數據 測試資料庫為:mysql (5.... ...
項目背景
有三張百萬級數據表
知識點表(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
***************************************************************************作者:小虛竹
歡迎任何形式的轉載,但請務必註明出處。
限於本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。