淺談MySQL Buffer學習及思考

    本博文旨在結合本身看書理解,並藉此圖進行說明,若有謬誤,望你們指正,以共同探討爲目的,交流學習。
首先介紹一下此圖的由來:最近看關於mysql方面書籍的一點心得,把文字轉化成圖片而得,方便理解。
 

而後對以上參數進行一下簡單的介紹:
 
  
  
  
  
  1. 一、max_connections這個參數,這個參數指MySql的最大鏈接數,若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量,服務器根據本身的實際狀況進行增長,若是鏈接數越多,因MySql會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,因此要適當調整該值,不能盲目提升設值。能夠過mysql -e "SHOW VARIABLES LIKE 'max_connections';"查看當前狀態的鏈接數量來設定該值大小。當你常看到Too many connections 錯誤,能夠增長此值了,默認是100。 
  2.  
  3. 二、back_log這個參數主要是基於max_connections進行的一個額外鏈接,也就是說當mysql鏈接大於max_connections設置的值的話,而又在(max_connections+back_log)之間,則mysql會把新鏈接放到堆棧中,等待以前鏈接的process釋放,若是當前最大請求超過了(max_connections+back_log),就不會受權鏈接,固然該值也受約於系統的TCP/IP鏈接的偵聽隊列(系統的tcp_max_syn_backlog值的大小),能夠經過cat /proc/sys/net/ipv4/tcp_max_syn_backlog查看,固然能夠修改該值 
  4. sysctl -w net.ipv4.tcp_max_syn_backlog=N或在/etc/sysctl.conf中添加tcp_max_syn_backlog=N便可。 
  5.  

 
    因爲mysql被稱爲內存式數據庫,固然很內存是密不可分了,而他和內存的關係主要是經過緩衝區大小的幾個參數吧。
 
緩衝包括:全局緩衝和局部緩衝
 
全局緩衝參數大體有以下:
key_buffer_size, innodb_buffer_pool_size, innodb_additional_mem_pool_size,innodb_log_buffer_size, query_cache_size 
而局部緩衝(我本身習慣這麼叫,雖然不專業,呵呵)通常mysql還會爲每一個鏈接分配鏈接緩衝。
全局緩衝在上篇博客中有介紹,這地方就省略了。
 
局部緩存:
    每一個鏈接到MySQL服務器的線程都須要有本身的緩衝。大概須要馬上分配256K,甚至在線程空閒時,它們使用默認的線程堆棧,網絡緩存等。事務開始以後,則須要增長更多的空間。運行較小的查詢可能僅給指定的線程增長少許的內存消耗,然而若是對數據表作複雜的操做例如掃描、排序或者須要臨時表,則需分配大約read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的內存空間。不過它們只是在須要的時候才分配,而且在那些操做作完以後就釋放了。有的是馬上分配成單獨的組塊。tmp_table_size可能高達MySQL所能分配給這個操做的最大內存空間了。注意,這裏須要考慮的不僅有一點——可能會分配多個同一種類型的緩存,例如用來處理子查詢。一些特殊的查詢的內存使用量可能更大——若是在MyISAM表上作成批的插入時須要分配bulk_insert_buffer_size 大小的內存;執行 ALTER TABLE, OPTIMIZE TABLE, REPAIR TABLE命令時須要分配myisam_sort_buffer_size大小的內存。 
 
 
  
  
  
  
  1. read_buffer_size是MySql讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySql會爲它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能。  
  2.  
  3. sort_buffer_size是MySql執行排序使用的緩衝大小。若是想要增長ORDER BY的速度,首先看是否可讓MySQL使用索引而不是額外的排序階段。若是不能,能夠嘗試增長sort_buffer_size變量的大小。  
  4.  
  5. read_rnd_buffer_size是MySql的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySql會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySql會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。  
  6.  
  7. tmp_table_size是MySql的heap(堆積)表緩衝大小。全部聯合在一個DML指令內完成,而且大多數聯合甚至能夠不用臨時表便可以完成。大多數臨時表是基於內存的(HEAP)表。具備大的記錄長度的臨時表(全部列的長度的和)或包含BLOB列的表存儲在硬盤上。若是某個內部heap(堆積)表大小超過tmp_table_size,MySQL能夠根據須要自動將內存中的heap表改成基於硬盤的MyISAM表。還能夠經過設置tmp_table_size選項來增長臨時表的大小。也就是說,若是調高該值,MySql同時將增長heap表的大小,可達到提升聯接查詢速度的效果。 
 
  以上是結合本身經常使用的參數並查詢mysql手冊總結的。方便更直觀的學習和理解。 均我的看法,若有疑問,可共同交流學習!
相關文章
相關標籤/搜索