搜尋
首頁資料庫mysql教程優化SQl的30常用方法


mysql處理大量資料時的一些最佳化查詢速度方法

 最近一段時間由於工作需要,開始關注針對Mysql資料庫的select查詢語句的相關最佳化方法。

      由於參與的實際專案中發現當mysql表的資料量達到百萬級時,普通SQL查詢效率呈直線下降,如果where中的查詢條件較多時,其查詢速度簡直無法容忍。曾經測試對一個包含400多萬筆記錄(有索引)的表執行一條條件查詢,其查詢時間竟然高達40幾秒,相信這麼高的查詢延時,任何用戶都會抓狂。因此如何提高sql語句查詢效率,顯得十分重要。以下是網路上流傳較廣泛的30種SQL查詢語句最佳化方法:

    

 1、應盡量避免在where 子句中使用!=或運算符,否則將引擎放棄使用索引而進行全表掃描。

 2、對查詢進行最佳化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的欄位上建立索引。

 3、應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
     select id from t where num is null
     可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:
     select id from t where num=0

# 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

#     select id from t where num=20

#     select id from t where num=20
#     select.會導致全表掃描:(無法前置百分號)
     select id from t where name like '�c%'

    若要提升效率,可考慮全文檢索。


 6、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

 7、如果在where 子句中使用參數,也會導致全表掃描。因為SQL只有在執行時才會解析局部變數
,但最佳化程式不能將存取計畫的選擇延後到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立存取計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下列語句將進行全表掃描:
     select id from t where num=@num
     可改為強制查詢使用索引:

     select id from t with(index( @num

 8、應盡量避免在where 子句中對欄位進行表達式
操作,這將導致引擎放棄使用索引而進行全表掃描。如:
     select id from t where num/2=100
     應改為:

     select id from t where num=100*2###

 9、應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
     select id from t where substring(name,1,3)='abc'–name以abc開頭的id
     select id from t wheredatediff( day,createdate,'2005-11-30′)=0–'2005-11-30′產生的id
     應改為:
     select id from t 因id from t where createdate>='2005-11-30′ and createdate

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

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

 12、不要寫一些沒有意義的查詢,如需要產生一個空白表結構:

     select col1,col2 into #t from t where 1=0
     這類程式碼不會回傳任何結果集,但是會消耗系統資源的,應改成這樣:
     create table #t(…)

 13、很多時候用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)

 14、並非所有索引對查詢都有效,SQL是根據表中資料來進行查詢最佳化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

 15、索引並不是越多越好,索引固然可以提高對應的select 的效率,但同時也降低了insert 及update 的效率,因為insert 或update 時有可能會重建索引,所以怎樣建索引需慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

 16.應盡可能的避免

更新 clustered 索引資料列,因為clustered 索引資料列的順序就是表記錄的實體儲存順序,一旦該列值變更將導致整個表記錄的順序的調整,會耗費相當大的資源。若套用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將索引建置為 clustered 索引。

 17、盡量使用數字型字段,若只包含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連接的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連接時會 逐個比較

字符串中每一個字符,而對於數字型而言只需要比較一次就夠了。

 18、盡可能的使用varchar/nvarchar 代替char/nchar ,因為首先變長字段存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的字段內

搜尋效率顯然要高些。

 19、任何地方都不要使用 select * from t ,用特定的字段列表代替“*”,不要返回用不到的任何字段。

 20、盡量使用表格變數來取代臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。

 21、避免頻繁建立和

刪除臨時表,以減少系統表資源的消耗。

 22、臨時表並非不可用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使 用匯出表。

 23、在新建臨時表時,如果一次插入資料量很大,那麼可以使用select into 代替create table,避免造成大量log ,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert。

 24、如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表明確刪除,先truncate table ,然後drop table ,這樣可以避免系統表的較長時間鎖定。

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

 26、使用基於遊標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

 27、與臨時表一樣,遊標並非無法使用。對小型資料集使用 FAST_FORWARD 遊標通常優於其他逐行處理方法,尤其是在必須引用幾個表格才能獲得所需的資料時。在結果集中包含「合計」的例程通常比使用遊標執行的速度快。如果開發時 間允許,基於遊標的方法和基於集的方法都可以嘗試一下,看看哪一種方法的效果更好。

 28、在所有的預存程序和觸發器的開始處設定 SET NOCOUNT ON ,在結束時設定 SET NOCOUNT OFF 。無需在執行預存程序和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 訊息。

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

 30、盡量避免大事務作業,提升系統同時能力。

以上是優化SQl的30常用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL和其他SQL方言之間的語法有什麼區別?MySQL和其他SQL方言之間的語法有什麼區別?Apr 27, 2025 am 12:26 AM

mysqldiffersfromothersqldialectsinsyntaxforlimit,自動啟動,弦樂範圍,子征服和表面上分析。 1)MySqluessLipslimit,whilesqlserverusestopopandoraclesrontersrontsrontsrontsronnum.2)

什麼是mysql分區?什麼是mysql分區?Apr 27, 2025 am 12:23 AM

MySQL分區能提升性能和簡化維護。 1)通過按特定標準(如日期範圍)將大表分成小塊,2)物理上將數據分成獨立文件,3)查詢時MySQL可專注於相關分區,4)查詢優化器可跳過不相關分區,5)選擇合適的分區策略並定期維護是關鍵。

您如何在MySQL中授予和撤銷特權?您如何在MySQL中授予和撤銷特權?Apr 27, 2025 am 12:21 AM

在MySQL中,如何授予和撤銷權限? 1.使用GRANT語句授予權限,如GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host';2.使用REVOKE語句撤銷權限,如REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host',確保及時溝通權限變更。

說明InnoDB和Myisam存儲引擎之間的差異。說明InnoDB和Myisam存儲引擎之間的差異。Apr 27, 2025 am 12:20 AM

InnoDB適合需要事務支持和高並發性的應用,MyISAM適合讀多寫少的應用。 1.InnoDB支持事務和行級鎖,適用於電商和銀行系統。 2.MyISAM提供快速讀取和索引,適合博客和內容管理系統。

MySQL中有哪些不同類型的連接?MySQL中有哪些不同類型的連接?Apr 27, 2025 am 12:13 AM

MySQL中有四種主要的JOIN類型:INNERJOIN、LEFTJOIN、RIGHTJOIN和FULLOUTERJOIN。 1.INNERJOIN返回兩個表中符合JOIN條件的所有行。 2.LEFTJOIN返回左表中的所有行,即使右表中沒有匹配的行。 3.RIGHTJOIN與LEFTJOIN相反,返回右表中的所有行。 4.FULLOUTERJOIN返回兩個表中所有符合或不符合JOIN條件的行。

MySQL中有哪些不同的存儲引擎?MySQL中有哪些不同的存儲引擎?Apr 26, 2025 am 12:27 AM

mysqloffersvariousStorageengines,每個suitedfordferentusecases:1)InnodBisidealForapplicationsNeedingingAcidComplianCeanDhighConcurncurnency,supportingtransactionsancions and foreignkeys.2)myisamisbestforread-Heavy-Heavywyworks,lackingtransactionsactionsacupport.3)記憶

MySQL中有哪些常見的安全漏洞?MySQL中有哪些常見的安全漏洞?Apr 26, 2025 am 12:27 AM

MySQL中常見的安全漏洞包括SQL注入、弱密碼、權限配置不當和未更新的軟件。 1.SQL注入可以通過使用預處理語句防止。 2.弱密碼可以通過強制使用強密碼策略避免。 3.權限配置不當可以通過定期審查和調整用戶權限解決。 4.未更新的軟件可以通過定期檢查和更新MySQL版本來修補。

您如何確定MySQL中的慢速查詢?您如何確定MySQL中的慢速查詢?Apr 26, 2025 am 12:15 AM

在MySQL中識別慢查詢可以通過啟用慢查詢日誌並設置閾值來實現。 1.啟用慢查詢日誌並設置閾值。 2.查看和分析慢查詢日誌文件,使用工具如mysqldumpslow或pt-query-digest進行深入分析。 3.優化慢查詢可以通過索引優化、查詢重寫和避免使用SELECT*來實現。

See all articles

熱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

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

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),