首頁 資料庫 mysql教程 sql語句如何最佳化?

sql語句如何最佳化?

Apr 08, 2019 am 11:06 AM
sql 最佳化

sql語句優化的幾種方法有:1、統一SQL語句的格式;2、對查詢進行最佳化,應盡量避免全表掃描;3、SQL語句要簡潔;4、考慮使用「臨時表」暫存中間結果;5、盡量避免大事務操作;6、盡量避免向客戶端傳回大資料量。以下這篇文章就來給大家具體介紹一些,希望對大家有幫助。

sql語句如何最佳化?

我們開發專案上線初期,由於業務資料量相對較少,一些SQL的執行效率對程式運作效率的影響不太明顯,而開發和維運人員也無法判斷SQL對程式的運作效率有多大,故很少針對SQL進行專門的最佳化,而隨著時間的積累,業務資料量的增多,SQL的執行效率對程式的運作效率的影響逐漸增大,此時對SQL的最佳化就很有必要。

sql語句最佳化的幾種方法:

#1、統一SQL語句的格式

#對於以下兩句SQL語句,很多人認為是相同的,但是,資料庫查詢最佳化器認為是不同的。

 ● select * from dual

 ● select * From dual

雖然只是大小寫不同,查詢分析器就認為是兩句不同的SQL語句,必須進行兩次解析。產生2個執行計劃。所以身為程式設計師,應該要保證相同的查詢語句在任何地方都一致,多一個空格都不行!

2、少用 * ,用具體的欄位清單取代“*”,不要傳回任何用不到的欄位。

3、對查詢進行最佳化,應盡量避免全表掃描

1)、應考慮在 where 及 order by 涉及的列上建立索引。

2)、應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:    

select id from t where num is null
登入後複製

#可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:    

select id from t where num=0
登入後複製

3)、應盡量避免在where 子句中使用!=或<>運算子,否則會導致引擎放棄使用索引而進行全表掃描

4)、應盡量避免在where 子句中使用or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:    

select id from t where num=10 or num=20
登入後複製

可以這樣查詢:    

select id from t where num=10    
union all    
select id from t where num=20
登入後複製

5)、慎用in 和not in,否則會導致全表掃描,如:    

select id from t where num in(1,2,3)
登入後複製

對於連續的數值,能用between 就不要用in 了:    

select id from t where num between 1 and 3
登入後複製

6)、合理使用like模糊查詢

有的時候會需要進行一些模糊查詢例如:

select * from contact where username like ‘%yue%’
登入後複製

關鍵字%yue%,由於yue前面用到了“%”,因此該查詢必然走全表掃描,除非必要,否則不要在關鍵字前加%

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

select id from t where num/2=100
登入後複製

應改為:    

select id from t where num=100*2
登入後複製

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

查詢name以abc開頭的id   

select id from t where substring(name,1,3)=&#39;abc&#39;
登入後複製

應改為:    

select id from t where name like &#39;abc%&#39;
登入後複製

4、以exists 取代in 

4. #很多時候用exists 代替in 是一個好的選擇,Exists只檢查存在性,效能比in強很多。例:   

select num from a where num in(select num from b)
登入後複製

用下面的語句替換:    

select num from a where exists(select 1 from b where num=a.num)
登入後複製
5、不要把SQL語句寫得太長,太過冗餘、簡潔;能用一句千萬不要用兩句

一般,將一個Select語句的結果當作子集,然後從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。因為它被繞暈了。像這種類似人工智慧的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證資料庫也會暈的。

另外,執行計劃是可以重複使用的,越簡單的SQL語句被重複使用的可能性越高。而複雜的SQL語句只要有一個字元改變就必須重新解析,然後再把這一大堆垃圾塞在記憶體裡。可想而知,資料庫的效率會何等低下。

6、考慮使用「臨時表」暫存中間結果

###簡化SQL語句的重要方法就是採用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這可以避免程式中多次掃描主表,也大大減少了程式執行中“共享鎖”阻塞“更新鎖” ,減少了阻塞,提高了並發性能。 ###

7、在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,    否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。

8、盡量使用數字型欄位,若只含數值資訊的欄位盡量不要設計為字元型,這會降低查詢和連接的效能,並會增加儲存開銷。    
這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字符,而對於數字型而言只需要比較一次就夠了。

9、盡可能的使用varchar 代替char ,因為首先變長字段存儲空間小,可以節省存儲空間,    其次對於查詢來說,在一個相對較小的字段內搜尋效率顯然要高些。    

10、避免經常建立和刪除臨時表,以減少系統表資源的消耗。

11、盡量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該考慮改寫。

12、盡量避免大事務操作,提高系統並發能力。

13、盡量避免向客戶端傳回大資料量,若資料量過大,應考慮對應需求是否合理。

相關影片教學推薦:《MySQL教學

以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。更多精彩內容大家可以追蹤php中文網相關教學欄位! ! !

以上是sql語句如何最佳化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
Hibernate 框架中 HQL 和 SQL 的差異是什麼? Hibernate 框架中 HQL 和 SQL 的差異是什麼? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

C++ 程式最佳化:時間複雜度降低技巧 C++ 程式最佳化:時間複雜度降低技巧 Jun 01, 2024 am 11:19 AM

時間複雜度衡量演算法執行時間與輸入規模的關係。降低C++程式時間複雜度的技巧包括:選擇合適的容器(如vector、list)以最佳化資料儲存和管理。利用高效演算法(如快速排序)以減少計算時間。消除多重運算以減少重複計算。利用條件分支以避免不必要的計算。透過使用更快的演算法(如二分搜尋)來優化線性搜尋。

MySQL連線數對資料庫效能的影響分析 MySQL連線數對資料庫效能的影響分析 Mar 16, 2024 am 10:09 AM

MySQL連線數對資料庫效能的影響分析隨著網路應用的不斷發展,資料庫成為了支援應用系統重要的資料儲存和管理工具。在資料庫系統中,連線數是一個重要的概念,它直接關係到資料庫系統的效能和穩定性。本文將從MySQL資料庫的角度出發,探討連線數對資料庫效能的影響,並透過具體的程式碼範例進行分析。一、連線數是什麼?連線數指的是資料庫系統同時支援的客戶端連線數,也可以理

優化WIN7系統開機啟動項目的操作方法 優化WIN7系統開機啟動項目的操作方法 Mar 26, 2024 pm 06:20 PM

1.在桌面上按組合鍵(win鍵+R)開啟運行窗口,接著輸入【regedit】,回車確認。 2.開啟登錄編輯程式後,我們依序點選展開【HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorer】,然後看目錄裡有沒有Seri​​alize項,如果沒有我們可以點選右鍵Explorer,新建項,並將其命名為Serialize。 3.接著點選Serialize,然後在右邊窗格空白處點選滑鼠右鍵,新建一個DWORD(32)位元值,並將其命名為Star

解決 PHP 函數效率低的方法有哪些? 解決 PHP 函數效率低的方法有哪些? May 02, 2024 pm 01:48 PM

PHP函數效率最佳化的五大方法:避免不必要的變數複製。使用引用以避免變數複製。避免重複函數呼叫。內聯簡單的函數。使用數組優化循環。

Vivox100s參數配置大揭密:處理器效能如何最佳化? Vivox100s參數配置大揭密:處理器效能如何最佳化? Mar 24, 2024 am 10:27 AM

Vivox100s參數配置大揭密:處理器效能如何最佳化?在當今科技快速發展的時代,智慧型手機已經成為我們日常生活不可或缺的一部分。作為智慧型手機的重要組成部分,處理器的效能優化直接關係到手機的使用體驗。 Vivox100s作為一款備受矚目的智慧型手機,其參數配置備受關注,尤其是處理器效能的最佳化議題更是備受用戶關注。處理器作為手機的“大腦”,直接影響手機的運行速度

基於哈希表的資料結構優化PHP數組交集和並集的計算 基於哈希表的資料結構優化PHP數組交集和並集的計算 May 02, 2024 pm 12:06 PM

利用雜湊表可最佳化PHP數組交集和並集計算,將時間複雜度從O(n*m)降低到O(n+m),具體步驟如下:使用雜湊表將第一個數組的元素映射到布林值,以快速找出第二個陣列中元素是否存在,提高交集計算效率。使用雜湊表將第一個陣列的元素標記為存在,然後逐一新增第二個陣列的元素,忽略已存在的元素,提高並集計算效率。

PHP 函數最佳化指南:提速秘術盡在此處 PHP 函數最佳化指南:提速秘術盡在此處 Apr 24, 2024 am 11:39 AM

PHP函數最佳化秘訣:快取查詢結果以避免重複資料庫存取。減少不必要的函數調用,如使用函數內聯。最佳化演算法,選擇時間複雜度較低的演算法。利用PHP擴展,如Memcached用於緩存,APC用於編譯和緩存PHP腳本。

See all articles