• 當前位置:首頁 > IT技術 > 數據庫 > 正文

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析
    2021-12-13 17:50:36

    目錄

    項目背景

    7、在 where 子句中使用參數,是不會導致全表掃描。

    案例分析

    8、在 where 子句中對字段進行表達式操作,是不會導致全表掃描。不過查詢速度會變慢,所以盡量避免使用。

    案例分析

    優化方案

    9、應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。

    案例分析

    優化方案

    10.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

    11.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用(這個在mysql中不對),并且應盡可能的讓字段順序與索引順序相一致。

    案例分析

    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 子句中使用參數,是不會導致全表掃描。

    案例分析

    ?
    ?

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_優化

    8、在 where 子句中對字段進行表達式操作,是不會導致全表掃描。不過查詢速度會變慢,所以盡量避免使用。

    案例分析

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_mysql_02

    ?

    執行時間是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子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。

    案例分析

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_數據庫優化_03

    ?

    優化方案

    SELECT *
    FROM ex_subject_point 
    WHERE CREATE_DT >= "2018-05-31"
    AND CREATE_DT < "2018-07-01"
    但是EXPLAIN一下,發現這樣還是全表掃描的

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_案例分析_04

    ?

    難道是因為日期字段索引沒有效果嗎?還是因為用了>=和<運算符號?
    來驗證一下
    縮小查詢范圍,發現索引是有效果的。所以不是日期字段的問題。

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_數據庫優化_05

    換個字段查詢,用>=和<運算符號,索引還是有效果的。但那是什么原因呢?

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_數據庫優化_06

    后來去網上查找了資料,原因是查詢數量是超過表的一部分,mysql30%,oracle 20%(這個數據可能不準確,不是官方說明,僅供參考),導致索引失效。
    10.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
    例子請看第8點和第9點。
    11.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用(這個在mysql中不對),并且應盡可能的讓字段順序與索引順序相一致。

    案例分析

    復合索引字段:PATH,PARENT_POINT_ID

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_mysql_07

    ?

    ?

    ?

    調換WHERE子句中的條件順序。發現還是可以使用索引的

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_案例分析_08

    復合索引只查詢第一個字段,是有效果的

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_案例分析_09

    ?

    復合索引只查詢第二個字段,發現索引沒有效果了。

    數據庫sql優化總結之2-百萬級數據庫優化方案+案例分析_百萬數據優化_10

    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

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码