【Mysql 學習】Mysql 怎樣使用記憶體

楊奇龍發表於2011-01-02

在應用的地方,給出與儲存器使用相關的伺服器變數的名字。

1 關鍵字緩衝區(變數key_buffer_size)由所有執行緒分享;當需要時,分配伺服器使用的其他緩衝區。

2 每個連線使用一些執行緒特定的空間;一個棧(預設64K,變數thread_stack)、一個連線緩衝區(變數

net_buffer_length)和一個結果緩衝區(變數net_buffer_length)。當需要時,連線緩衝區和結果緩衝區動

態地被擴大到max_allowed_packet。當一個查詢正在執行當前查詢的一個複製時,也分配字串。

3 所有執行緒共享同一基儲存器。

4 目前還沒有什麼是記憶體對映的(除了壓縮表,但是那是另外一個的故事)。這是因為4GB的32位儲存器空間

對最大的資料庫來所不是足夠大的。當一個64位定址空間的系統變得更普遍時,我們可以為記憶體對映增加全

面的支援。
每個做順序掃描的請求分配一個讀緩衝區(變數record_buffer)。

5 所有聯結均用一遍完成並且大多數聯結可以甚至不用一張臨時表來完成。最臨時的表是基於記憶體的(HEAP)

表。有較大記錄長度(以所有列的長度之和計算)的臨時表或包含BLOB列的表在磁碟上儲存。在MySQL版本

3.23.2前一個問題是如果一張HEAP表超過tmp_table_size的大小,你得到錯誤The table tbl_name is full

。在更新的版本中,這透過必要時自動將在記憶體的(HEAP)錶轉變為一個基於磁碟(MyISAM)的表來處理。為了

解決這個問題,你可以透過設定mysqld的tmp_table_size選項,或透過在客戶程式中設定SQL的

SQL_BIG_TABLES選項增加臨時表的大小。在MySQL 3.20中,臨時表的最大尺寸是record_buffer*16,因此如

果你正在使用這個版本,你必須增加record_buffer值。你也可以使用--big-tables選項啟動mysqld以總將

臨時表儲存在磁碟上,然而,這將影響許多複雜查詢的速度。

6 大多數做排序的請求分配一個排序緩衝區和一個或二個臨時檔案。

幾乎所有的語法分析和計算都在一家本地儲存器中完成。對小專案沒有記憶體開銷並且一般的較慢儲存器分配

和釋放被避免。記憶體僅為出乎意料的大字串分配(這用malloc()和free()完成)。

7 每個索引檔案只被開啟一次,並且資料檔案為每個併發執行的執行緒開啟一次。對每個併發執行緒,分配一個

表結構、對每列的列結構和大小為3 * n的一個緩衝區(這裡n是最大的行長度,不算BLOB列)。一個BLOB使用

5 ~ 8個位元組加上BLOB資料。

8 對每個有BLOB列的表,一個緩衝區動態地被擴大以便讀入更大的BLOB值。如果你掃描一個表,分配與最大

BLOB值一樣大的一個緩衝區。

9 對所有在用的表的表處理器被儲存在一個快取中並且作為一個FIFO管理。通常快取有64個入口。如果一個表同時被2個執行的執行緒使用,快取為此包含2個入口。

10 一個mysqladmin flush-tables命令關閉所有不在用的表並在當前執行的執行緒結束時,標記所有在用的表準備被關閉。這將有效地釋放大多數在用的記憶體。
 
ps和其他系統狀態程式可以報導mysqld使用很多記憶體。這可以是在不同的記憶體地址上的執行緒棧造成的。例如

,Solaris版本的ps將棧間未用的記憶體算作已用的記憶體。你可以透過用swap -s檢查可用交換區來驗證它。我

們用商業記憶體漏洞探查器測試了mysqld,因此應該有沒有記憶體漏洞。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-683169/,如需轉載,請註明出處,否則將追究法律責任。

相關文章