程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> MySql刪除和更新操尴尬刁難機能有影響嗎

MySql刪除和更新操尴尬刁難機能有影響嗎

編輯:MSSQL

MySql刪除和更新操尴尬刁難機能有影響嗎。本站提示廣大學習愛好者:(MySql刪除和更新操尴尬刁難機能有影響嗎)文章只能為提供參考,不一定能成為您想要的結果。以下是MySql刪除和更新操尴尬刁難機能有影響嗎正文


刪除和更新操作的開支常常比拔出高,所以一個好的設計須要削減對數據庫的更新和刪除操作。

3.1更新操作

數據庫的更新操作會帶來連續串的“效應”:更新操作須要記載日記(以便毛病時回滾);更新可變長字段(如,varchar類型)會帶來數據物理存儲的變更(記載的挪動);更新索引字段會招致索引重建;更新主鍵會招致數據重組等。這一切不只會形成更新操作自己效力低,並且因為磁片碎片的發生會形成今後查詢機能的下降。為了應對這一情形,有兩種戰略:1、削減更新次數,把多個字段的更新寫到統一個語句裡;2、防止更新。這兩種戰略分離實用於分歧的情形,上面將舉例解釋兩種情形。

3.1.1削減更新次數
在整合庫裡有個代碼清洗進程,就是經由過程銜接代碼表給營業數據的自編碼字段賦值。代碼清洗實際上是經由過程聯系關系代碼表來更新營業數據表的一個進程,須要銜接多個代碼表,更新多個自編碼字段。完成此更新,有兩種更新語句的寫法:一種是寫成多個SQL語句,每一個語句更新一個自編碼字段;另外一種寫法是將一切更新寫在一個語句中。更新銀行代碼的更新語句以下所示:

updateTBL_INCOME_TMP A
setBANKCODESELF = (
 select SELFCODE
 from
 TBL_BANKINFO B
 where A.BANKCODE = B.BANKCODE )

經由過程一個更新語句完成多個自編碼字段更新的語句表示以下:


updateTBL_INCOME_TMP

set 代碼1自編碼 = 經由過程聯系關系代碼1表獲得自編碼,
    代碼2自編碼 =經由過程聯系關系代碼2表獲得自編碼,
    ...,
    代碼n自編碼 =經由過程聯系關系代碼n表獲得自編碼

應用兩萬萬的測試數據。兩種辦法的測試成果以下表所示。從測試成果看出,一次更新辦法機能進步了十倍,年夜年夜進步了機能。

處置進程

屢次更新辦法耗時

一次更新辦法耗時

代碼清洗

0:29:48
0:02:59

3.1.2防止更新

上面舉個淺顯的例子,這類情形是常常碰到的。某公司有一套體系員工考勤體系,為了進步查詢統計的機能,在原有體系基本上樹立了一些包括冗余信息的表。以員工表為例,它取得數據的進程如圖12所示。第一步把員工信息放到新表中,然後銜接經由過程字段“部分ID”銜接更新“部分稱號”。

圖12. 聯系關系更新

普通,為了節儉存儲開支把部分稱號如許的字段設計成可變長的。所以在對它停止更新時會形成磁盤數據的從新組織,構成磁盤碎片,影響查詢機能。

為了不如許的情形產生,我們可使用如圖13所示的辦法防止更新。這類辦法一步完成了冗余數據表的拔出,再拔出時銜接部分表取得“部分稱號”,從而防止了更新操作。

圖13. 防止更新

3.2刪除操作

初學者能夠以為刪除操作很簡略,可以疾速完成。其實這是一個毛病的懂得,刪除進程須要年夜量掃描磁盤;須要記載數據庫日記;並且刪除進程不釋放磁盤空間,糟蹋磁盤,而且使磁盤上的數據四分五裂,這對後續查詢的機能是一個致命的襲擊。平日用兩種方法來應對:1、對常常做刪除操作的表停止重組(reorg);2、防止刪除。

3.2.1 重組

重組(reorg)操作會從新分列表數據的物理次序,並除去碎片數據中的余暇空間。

因為刪除操作不釋放磁盤空間,在履行刪除操作後,表會成為碎片狀,這招致機能嚴重降低,在屢次更新操作以後也會湧現這類情形。若搜集了統計信息,但看不出有顯著的機能改良,則重組表數據能夠會有贊助。重組表數據時,依據指定的索引從新支配數據的物理次序,並除去碎片數據中的余暇空間。這使該數據可以更疾速的被存取,從而改良機能。

3.2.2 防止刪除——中央表和正式表形式

在數據須要比擬龐雜的處置的時刻常常會用到中央表和正式表形式。數據在中央表中被處置,然後把知足前提的數據轉移至正式表,不知足前提的數據保存在中央表中。圖14表示了數據從中央表轉移到正式表的進程:在完成數據處置以後,須要把中央表temp1中flag = 1的數據拔出到正式表,並刪除中央表temp1中flag = 1的數據。

圖14. 從中央表向正式表轉移數據

由於flag字段不是聚簇索引,所以當對中央表temp1停止刪除後,會再磁盤中留下年夜量碎片,如圖15所示。不只會留下那末多的磁盤碎片,並且已刪除的數據的空間也不會主動釋放。成果是不只糟蹋磁盤空間,並且查詢機能會急劇降低。

圖15. 刪除操作後的磁盤碎片

我們可使用清空表的敕令來防止刪除操作。除中央表temp1和正式表,添加幫助暫時表temp2。假如temp1中保存的數據flag=0只占領10%,這一優化將明顯晉升機能。詳細步調以下:

1.         將temp1中flag=0的數據,拔出到temp2

2.         清空表temp1


alter table temp1 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE ;

3.        將temp2中的數據拔出temp1

3.3若何使拜訪更高效

本末節的內容很年夜一部門來自《The Art of SQL》這本書,這本書裡聚集了數據庫開辟的通用經歷。固然沒有局限於詳細的DBMS和硬件平台,然則倒是一本理論性很強的書。

1.一次銜接數據庫,做許多工作。直隨處理完,才斷開銜接。
2.一個SQL語句包括盡可能多的操作。抽象地說:幾千個語句,借助游標赓續輪回,很慢。換成幾個語句,處置異樣的數據,照樣很慢。換成一個語句,處理成績,最好。
3.接近DBMS焦點。盡可能應用數據庫自帶的函數。削減自界說函數。由於再聰慧的數據庫優化器也不熟悉自界說函數。
4.一個語句不要銜接太多的表,建議的下限是5個。
5.將頻仍更新的列集中起來:當更新某一行時,DB2 會記載停止更改的一切列,是以將頻仍更新的列放到一路可以削減 DB2 的記載任務。這只是一個有關機能的小建議,是以不該為完成它而停止嚴重的運用法式或數據庫設計修正。

以上就是本文針對MySql刪除和更新對機能有影響嗎的全體內容,願望愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved