你還在 Select * 嗎?

閱讀本文大概須要 1.6 分鐘。程序員

做者:AIOps面試

應用程序慢如牛,緣由多多,多是網絡的緣由、多是系統架構的緣由,還有多是數據庫的緣由。數據庫

那麼如何提升數據庫SQL語句執行速度呢?有人會說性能調優是數據庫管理員(DBA)的事,然而性能調優跟程序員們也有莫大的關係。編程

程序中嵌入的一行行的SQL語句,若是使用了一些優化小技巧,定能達到事半功倍的效果。服務器

技巧1 比較運算符能用 「=」就不用「<>」微信

「=」增長了索引的使用概率。網絡

技巧2 明知只有一條查詢結果,那請使用 「LIMIT 1」架構

「LIMIT 1」能夠避免全表掃描,找到對應結果就不會再繼續掃描了。併發

技巧3 爲列選擇合適的數據類型性能

能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盤和內存消耗越小越好嘛。

技巧4 將大的DELETE,UPDATE or INSERT 查詢變成多個小查詢

能寫一個幾十行、幾百行的SQL語句是否是顯得逼格很高?然而,爲了達到更好的性能以及更好的數據控制,你能夠將他們變成多個小查詢。

技巧5 使用UNION ALL 代替 UNION,若是結果集容許重複的話

由於 UNION ALL 不去重,效率高於 UNION。

技巧6 爲得到相同結果集的屢次執行,請保持SQL語句先後一致

這樣作的目的是爲了充分利用查詢緩衝。

好比根據地域和產品id查詢產品價格,第一次使用了:

那麼第二次一樣的查詢,請保持以上語句的一致性,好比不要將where語句裏面的id和region位置調換順序。

技巧7 儘可能避免使用 「SELECT *」

若是不查詢表中全部的列,儘可能避免使用 SELECT *,由於它會進行全表掃描,不能有效利用索引,增大了數據庫服務器的負擔,以及它與應用程序客戶端之間的網絡IO開銷。

技巧8 WHERE 子句裏面的列儘可能被索引

只是「儘可能」哦,並非說全部的列。因地制宜,根據實際狀況進行調整,由於有時索引太多也會下降性能。

技巧9 JOIN 子句裏面的列儘可能被索引

一樣只是「儘可能」哦,並非說全部的列。

技巧10 ORDER BY 的列儘可能被索引

ORDER BY的列若是被索引,性能也會更好。

技巧11 使用 LIMIT 實現分頁邏輯

不只提升了性能,同時減小了沒必要要的數據庫和應用間的網絡傳輸。

技巧12 使用 EXPLAIN 關鍵字去查看執行計劃

EXPLAIN 能夠檢查索引使用狀況以及掃描的行。

其餘

SQL調優方法有不少種,一樣的查詢結果能夠有不少種不一樣的查詢方式。其實最好的方法就是在開發環境中用最貼近真實的數據集和硬件環境進行測試,而後再發布到生產環境中。

 

 

·END·

程序員的成長之路

路雖遠,行則必至

本文原發於 同名微信公衆號「程序員的成長之路」,回覆「1024」你懂得,給個讚唄。

微信ID:cxydczzl

 

往期精彩回顧

相關文章
相關標籤/搜索