淺談MySQL Buffer學習及思考

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

然後對以上參數進行一下簡單的介紹:
 
  1. 1、max_connections這個參數,這個參數指MySql的最大連接數,如果服務器的併發連接請求量比較大,建議調高此值,以增加並行連接數量,服務器根據自己的實際情況進行增加,如果連接數越多,因MySql會爲每個連接提供連接緩衝區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。可以過mysql -e "SHOW VARIABLES LIKE 'max_connections';"查看當前狀態的連接數量來設定該值大小。當你常看到Too many connections 錯誤,可以增加此值了,默認是100。 
  2.  
  3. 2、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手冊總結的。方便更直觀的學習和理解。均個人見解,如有疑問,可共同交流學習!
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章