SQL效能簡單最佳化(作為初級程式員的想法)

來源:互聯網
上載者:User

標籤:程式   根據   就是   對比   影響   4條   對象   規範   分數   

隨筆背景:雖然參與正式項目開發已經近兩年了,但是之前涉及的資料都不是很大,就算資料量夠了,但是也沒涉及到統計,所以之前開發的時候僅僅注意商務邏輯是否正確,代碼是否精簡。本次做的一個項目,寫資料統計的介面,剛開始也只是注意邏輯,不過後來資料量僅僅到了40萬的時候,一個按照年齡區段擷取各年齡的普及率介面竟然花了近一分鐘,所以開始了我的最佳化路程。

一、從SQL上來看,首先想到的是把SQL上的商務邏輯拿出來,放到代碼裡面實現。比如這雷根據年齡區段擷取各年齡的普及率,可以把拆成兩個SQL,一個統計各年齡段總人數,一個統計各年齡段普及的人數,具體計算比例可以在代碼實現。原理是SQL裡面加上邏輯處理的話是針對大數量的邏輯處理,而代碼處理的話僅僅是對已經統計過的資料處理,這樣對比一下邏輯處理的對象就知道為啥快點了。

如: select sum(case when a.answer != ‘01‘ then 1 else 0 end)/count(a.id) pjl from tableA a group by a.age  

拆分: select count(a.id) from tableA a  where a. answer != ‘01‘ group by a.age

    select count(a.id) from tableA a where group by a.age

二、不是說所有的子查詢都會比較慢,都是不好的。個人之前覺得子查詢很耗效能,明明可以關聯查詢的,為什麼還要子查詢。然後本次發現其實合理的利用子查詢可以有效提高速率,如可以通過子查詢篩選一部分資料,然後再對篩選後的資料關聯。

如:select a.name,a.code from tableA a left join tableB b on b.code = a.code  where b.status = ‘2‘  

修改:select a.name,a.code from tableA a where a.code in (select code from tableB where status = ‘2‘)

原SQL是先關聯然後篩選資料的,關聯笛卡爾積 乘法的概念,可以理解為先把所有資料進行比對,比如一個tableA 4條,一個tableB 5條,那就是比對4*5 = 20次

而先篩選一次的話,就是意味著先對tableB篩選,篩選出3條,然後在對tableA篩選,5+4 = 9次 資料量小還無所謂,那數量大的話。。。。

三、where條件後面的篩選條件位置有影響

mysql where 執行順序從左至右 也就意味著把過濾效果最大的放在最上面或者說靠where越近

oracle where 執行順序從右至左 也就意味著把過濾效果最大的放在最下面或者說靠where越遠

表的位置也符合這規律(表位置沒試過,網上說的)

四、查詢列時,盡量不用* 用具體的參數,以前寫代碼圖方便經常寫個* ,其實有的時候根本用不到那麼多屬性,所以查的少當然快點咯

如: select * from tableA

改成:select name,code from tableA

五、如果表加了索引的欄位,書寫值一定要規範,如例子雖然也能查出正確的結果,不過此時該欄位查詢索引未生效,所以還是稍微麻煩點打上‘’

如:select code from tableB where status = 2     (表欄位status為char類型)

修改:select code from tableB where status = ‘2‘

六、從表的方面可以把需要篩選的欄位加上索引,效果就像開了掛一樣哈哈,反正我的語句我覺得就是索引加的從一分鐘到了20秒,個人覺得這個很好用

以上就是本次最佳化效能用到的方法,不過影響效能的不僅僅是這些方面,比如還有資料庫本身的影響,我們的資料庫是開發用的16G mysql,總而言之每個地兒都扣點,效能當然快很多了,積水成淵嘛。額,以上的想法只是本人本次試過的方法,有些原理可能還是漏洞百出(不過我確實快了。。),雖然40萬資料其實也沒多少,相比那些百萬千萬,甚至億級的,抱歉我還很菜,這種的找我老大,我還是鹹魚一條。

SQL效能簡單最佳化(作為初級程式員的想法)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.