程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 淺析MySQL內存的應用解釋(全局緩存+線程緩存)

淺析MySQL內存的應用解釋(全局緩存+線程緩存)

編輯:MySQL綜合教程

淺析MySQL內存的應用解釋(全局緩存+線程緩存)。本站提示廣大學習愛好者:(淺析MySQL內存的應用解釋(全局緩存+線程緩存))文章只能為提供參考,不一定能成為您想要的結果。以下是淺析MySQL內存的應用解釋(全局緩存+線程緩存)正文


起首我們來看一個公式,MySQL中內存分為全局內存和線程內存兩年夜部門(其實其實不全體,只是影響比擬年夜的 部門):

per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_stack+join_buffer_size+binlog_cache_size
+tmp_table_size)*max_connections
global_buffers=
innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+key_buffer_size+query_cache_size
total_memory=global_buffers+per_thread_buffers

全局緩存:
key_buffer_size:決議索引處置的速度,特別是索引讀的速度。默許值是16M,經由過程檢討狀況值Key_read_requests和Key_reads,可以曉得key_buffer_size設置能否公道。比例key_reads / key_read_requests應當盡量的低,至多是1:100,1:1000更好(上述狀況值可使用'key_read%'取得用來顯示狀況數據)。key_buffer_size只對MyISAM表起感化。即便你不應用MyISAM表,然則外部的暫時磁盤表是MyISAM表,也要應用該值。可使用檢討狀況值'created_tmp_disk_tables'得知概況。

innodb_buffer_pool_size:InnoDB應用該參數指定年夜小的內存來緩沖數據和索引,這個是Innodb引擎中影響機能最年夜的參數。

innodb_additional_mem_pool_size:指定InnoDB用來存儲數據字典和其他外部數據構造的內存池年夜小。缺省值是8M。平日不消太年夜,只需夠用就行,應當與表構造的龐雜度有關系。假如不敷用,MySQL會在毛病日記中寫入一條正告信息。

innodb_log_buffer_size:指定InnoDB用來存儲日記數據的緩存年夜小,假如您的表操作中包括年夜量並發事務(或年夜范圍事務),而且在事務提交前請求記載日記文件,請盡可能調高此項值,以進步日記效力。

query_cache_size:是MySQL的查詢緩沖年夜小。(從4.0.1開端,MySQL供給了查詢緩沖機制)應用查詢緩沖,MySQL將SELECT語句和查詢成果寄存在緩沖區中,往後關於異樣的SELECT語句(辨別年夜小寫),將直接從緩沖區中讀取成果。依據MySQL用戶手冊,應用查詢緩沖最多可以到達238%的效力。經由過程檢討狀況值'Qcache_%',可以曉得query_cache_size設置能否公道:假如Qcache_lowmem_prunes的值異常年夜,則注解常常湧現緩沖不敷的情形,假如Qcache_hits的值也異常年夜,則注解查詢緩沖應用異常頻仍,此時須要增長緩沖年夜小;假如Qcache_hits的值不年夜,則注解你的查詢反復率很低,這類情形下應用查詢緩沖反而會影響效力,那末可以斟酌不消查詢緩沖。另外,在SELECT語句中參加SQL_NO_CACHE可以明白表現不應用查詢緩沖。

線程緩存
每一個銜接到MySQL辦事器的線程都須要有本身的緩沖。年夜概須要連忙分派256K,乃至在線程余暇時,它們應用默許的線程客棧,收集緩存等。事務開端以後,則須要增長更多的空間。運轉較小的查詢能夠僅給指定的線程增長大批的內存消費,但是假如對數據表做龐雜的操作例如掃描、排序或許須要暫時表,則需分派年夜約read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size年夜小的內存空間。不外它們只是在須要的時刻才分派,而且在那些操作做完以後就釋放了。有的是連忙分派成零丁的組塊。tmp_table_size 能夠高達MySQL所能分派給這個操作的最年夜內存空間了。

read_buffer_size:是MySQL讀入緩沖區年夜小。對表停止次序掃描的要求將分派一個讀入緩沖區,MySQL會為它分派一段內存緩沖區。read_buffer_size變量掌握這一緩沖區的年夜小。假如對表的次序掃描要求異常頻仍,而且你以為頻仍掃描停止得太慢,可以經由過程增長該變量值和內存緩沖區年夜小進步其機能。

sort_buffer_size:是MySQL履行排序應用的緩沖年夜小。假如想要增長ORDER BY的速度,起首看能否可讓MySQL應用索引而不是額定的排序階段。假如不克不及,可以測驗考試增長sort_buffer_size變量的年夜小。

read_rnd_buffer_size:是MySQL的隨機讀緩沖區年夜小。當按隨意率性次序讀取行時(例如,依照排序次序),將分派一個隨機讀緩存區。停止排序查詢時,MySQL會起首掃描一遍該緩沖,以免磁盤搜刮,進步查詢速度,假如須要排序年夜量數據,可恰當調高該值。但MySQL會為每一個客戶銜接發放該緩沖空間,所以應盡可能恰當設置該值,以免內存開支過年夜。

tmp_table_size:是MySQL的暫時表緩沖年夜小。一切結合在一個DML指令內完成,而且年夜多半結合乃至可以不消暫時表便可以完成。年夜多半暫時表是基於內存的(HEAP)表。具有年夜的記載長度的暫時表 (一切列的長度的和)或包括BLOB列的表存儲在硬盤上。假如某個外部heap(聚積)表年夜小跨越tmp_table_size,MySQL可以依據須要主動將內存中的heap表改成基於硬盤的MyISAM表。還可以經由過程設置tmp_table_size選項來增長暫時表的年夜小。也就是說,假如調高該值,MySQL同時將增長heap表的年夜小,可到達進步聯接查詢速度的後果。

thread_stack :重要用來寄存每個線程本身的標識信息,如線程id,線程運轉時根本信息等等,我們可以經由過程 thread_stack 參數來設置為每個線程棧分派多年夜的內存。

join_buffer_size:運用法式常常會湧現一些兩表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的時刻(all/index join),為了削減介入Join的“被驅動表”的讀取次數以進步機能,須要應用到 Join Buffer 來協助完成 Join操作。當 Join Buffer 太小,MySQL 不會將該 Buffer 存入磁盤文件,而是先將Join Buffer中的成果集與須要 Join 的表停止 Join 操作,然後清空 Join Buffer 中的數據,持續將殘剩的成果集寫入此 Buffer 中,如斯來去。這必將會形成被驅動表須要被屢次讀取,成倍增長 IO 拜訪,下降效力。

binlog_cache_size:在事務進程中包容二進制日記SQL 語句的緩存年夜小。二進制日記緩存是辦事器支撐事務存儲引擎而且辦事器啟用了二進制日記(—log-bin 選項)的條件下為每一個客戶端分派的內存,留意,是每一個Client 都可以分派設置年夜小的binlog cache 空間。假如體系中常常會湧現多語句事務的話,可以測驗考試增長該值的年夜小,以取得更好的機能。固然,我們可以經由過程MySQL 的以下兩個狀況變量來斷定以後的binlog_cache_size 的狀態:Binlog_cache_use 和Binlog_cache_disk_use。“max_binlog_cache_size”:和"binlog_cache_size"絕對應,然則所代表的是binlog 可以或許應用的最年夜cache 內存年夜小。當我們履行多語句事務的時刻,max_binlog_cache_size 假如不敷年夜的話,體系能夠會報出“ Multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage”的毛病。
個中須要留意的是:table_cache表現的是一切線程翻開的表的數量,和內存有關。

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