天天看點

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

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

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,是以應該有沒有記憶體漏洞。