亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

MySQL應用技巧之內存使用線程獨享

添加時間:2014-3-15 16:55:57  添加: 思海網絡 

  在這里我們將介紹的是MySQL內存使用上的線程獨享,線程獨享內存主要用于各客戶端連接線程存儲各種操作的獨享數據,如線程棧信息,分組排序操作,數據讀寫緩沖,結果集暫存等等,而且大多數可以通過相關參數來控制內存的使用量。

  對于任何一個數據庫管理系統來說,內存的分配使用絕對可以算的上是其核心之一了,所以很多希望更為深入了解某數據庫管理系統的人,都會希望一窺究竟,我也不例外。

  從內存的使用方式MySQL 數據庫的內存使用主要分為以下兩類

  線程獨享內存

  全局共享內存

  今天這篇文章暫時先分析 MySQL 中主要的 “線程獨享內存” 的。

  在 MySQL 中,線程獨享內存主要用于各客戶端連接線程存儲各種操作的獨享數據,如線程棧信息,分組排序操作,數據讀寫緩沖,結果集暫存等等,而且大多數可以通過相關參數來控制內存的使用量。

  線程棧信息使用內存(thread_stack):主要用來存放每一個線程自身的標識信息,如線程id,線程運行時基本信息等等,我們可以通過 thread_stack 參數來設置為每一個線程棧分配多大的內存。

  排序使用內存(sort_buffer_size):MySQL 用此內存區域進行排序操作(filesort),完成客戶端的排序請求。當我們設置的排序區緩存大小無法滿足排序實際所需內存的時候,MySQL 會將數據寫入磁盤文件來完成排序。由于磁盤和內存的讀寫性能完全不在一個數量級,所以sort_buffer_size參數對排序操作的性能影響絕對不可 小視。排序操作的實現原理請參考:MySQL Order By 的實現分析。

  Join操作使用內存(join_buffer_size):應用程序經常會出現一些兩表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的時候(all/index join),為了減少參與Join的“被驅動表”的讀取次數以提高性能,需要使用到 Join Buffer 來協助完成 Join操作(具體 Join 實現算法請參考:MySQL 中的 Join 基本實現原理)。當 Join Buffer 太小,MySQL 不會將該 Buffer 存入磁盤文件,而是先將Join Buffer中的結果集與需要 Join 的表進行 Join 操作,然后清空 Join Buffer 中的數據,繼續將剩余的結果集寫入此 Buffer 中,如此往復。這勢必會造成被驅動表需要被多次讀取,成倍增加 IO 訪問,降低效率。

  順序讀取數據緩沖區使用內存(read_buffer_size):這部分內存主要用于當需要順序讀取數據的時候,如無發使用索引的情況下的全 表掃描,全索引掃描等。在這種時候,MySQL 按照數據的存儲順序依次讀取數據塊,每次讀取的數據快首先會暫存在read_buffer_size中,當 buffer 空間被寫滿或者全部數據讀取結束后,再將buffer中的數據返回給上層調用者,以提高效率。

  隨機讀取數據緩沖區使用內存(read_rnd_buffer_size):和順序讀取相對應,當 MySQL 進行非順序讀取(隨機讀取)數據塊的時候,會利用這個緩沖區暫存讀取的數據。如根據索引信息讀取表數據,根據排序后的結果集與表進行Join等等。總的來 說,就是當數據塊的讀取需要滿足一定的順序的情況下,MySQL 就需要產生隨機讀取,進而使用到 read_rnd_buffer_size 參數所設置的內存緩沖區。

  連接信息及返回客戶端前結果集暫存使用內存(net_buffer_size):這部分用來存放客戶端連接線程的連接信息和返回客戶端的結果 集。當 MySQL 開始產生可以返回的結果集,會在通過網絡返回給客戶端請求線程之前,會先暫存在通過 net_buffer_size 所設置的緩沖區中,等滿足一定大小的時候才開始向客戶端發送,以提高網絡傳輸效率。不過,net_buffer_size 參數所設置的僅僅只是該緩存區的初始化大小,MySQL 會根據實際需要自行申請更多的內存以滿足需求,但最大不會超過 max_allowed_packet 參數大小。

  批量插入暫存使用內存(bulk_insert_buffer_size):當我們使用如 insert …values(…),(…),(…)… 的方式進行批量插入的時候,MySQL 會先將提交的數據放如一個緩存空間中,當該緩存空間被寫滿或者提交完所有數據之后,MySQL 才會一次性將該緩存空間中的數據寫入數據庫并清空緩存。此外,當我們進行 LOAD DATA INFILE 操作來將文本文件中的數據 Load 進數據庫的時候,同樣會使用到此緩沖區。

  臨時表使用內存(tmp_table_size):當我們進行一些特殊操作如需要使用臨時表才能完成的 Order By,Group By 等等,MySQL 可能需要使用到臨時表。當我們的臨時表較小(小于 tmp_table_size 參數所設置的大小)的時候,MySQL 會將臨時表創建成內存臨時表,只有當 tmp_table_size 所設置的大小無法裝下整個臨時表的時候,MySQL 才會將該表創建成 MyISAM 存儲引擎的表存放在磁盤上。不過,當另一個系統參數 max_heap_table_size 的大小還小于 tmp_table_size 的時候,MySQL 將使用 max_heap_table_size 參數所設置大小作為最大的內存臨時表大小,而忽略 tmp_table_size 所設置的值。而且 tmp_table_size 參數從 MySQL 5.1.2 才開始有,之前一直使用 max_heap_table_size。

  上面所列舉的 MySQL 線程獨享內存僅僅只是所有線程獨享內存中的部分,并不是全部,選擇的原則是可能對 MySQL 的性能產生較大的影響,且可以通過系統參數進行調節。

  由于以上內存都是線程獨享,極端情況下的內存總體使用量將是所有連接線程的總倍數。所以各位朋友在設置過程中一定要謹慎,切不可為了提升性能就 盲目的增大各參數值,避免因為內存不夠而產生 Out Of Memory 異常或者是嚴重的 Swap 交換反而降低整體性能

關鍵字:MySQL、線程、數據庫

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站