本文旨在結合自己看書理解,並藉此圖進行說明,如有謬誤,望大家指正,以共同探討為目的,交流學習。
首先介紹一下架構圖的由來:最近看關於mysql方面書籍的一點心得,把文字轉化成圖片而得,方便理解。
我主要從讀、寫、底層磁碟三方面進行闡述:
1、讀操作:
我們知道資料在讀取的時候,需要從磁碟讀到記憶體中,然後再做相應的操作,而在最佳化讀操作的時候,主要想buffer,cache這些進行最佳化:
key_buffer_size
這個對MyIsam表來說是一個比較重要的參數,一般可以把他設定成記憶體的30%-40%,當然這還要根據具體情況,MyISAM表會使用作業系統的緩衝來快取資料,因此需要留出部分記憶體給它們,很多情況下資料比索引大多了。
innodb_buffer_pool_size
這個對InnoDB來說是一個比較重要的參數,而InnoDB對緩衝更為敏感,MyISAM可以在預設的 key_buffer_size 設定下啟動並執行可以,然而Innodb在預設的 innodb_buffer_pool_size 設定下卻跟蝸牛似的。由於Innodb把資料和索引都緩衝起來,無需留給作業系統太多的記憶體,因此如果只需要用Innodb的話則可以設定它高達 70-80% 的可用記憶體。一些應用於 key_buffer 的規則有 — 如果你的資料量不大,並且不會暴增,那麼無需把 innodb_buffer_pool_size 設定的太大了。
table_cache
表的緩衝,這個佔用系統的資源和記憶體,因為每一個現成都需要開啟一個暫存資料表,所以當串連數大的時候可以加大此值。
thread-cache
線程的緩衝,線程的建立和銷毀開銷可能會很大,所以每個線程的串連和斷開需要,如果程式中活躍的並發串連數和Thread-Created的值比較大,可以稍微設定大一點此值。 【幫客之家 http://www.bkjia.com 】
query-cache
如果應用程式中有大量的讀,可以設定大一點此值,但是也不要太大,因為維護它也需要不少的開銷。一般設定32M-512M即可。
sort_buffer_size
這個是connection級的參數,在每個connection第一次需要使用這個buffer的時候,一次性分配設定的記憶體,此值不是越大越好,如果設定過大,碰上高並發的情況下就會使效能降低,sort_buffer_size 超過2KB的時候,就會使用mmap()而不是 malloc() 來進行記憶體配置,導致效率降低。
mysql暫存資料表 當工作在非常大的表上時,你可能偶爾需要運行很多查詢獲得一個大量資料的小的子集,不是對整個表運行這些查詢,而是讓MySQL每次找出所需的少數記錄,將記錄選擇到一個暫存資料表可能更快些,然後多這些表執行查詢。 mysql伺服器會自動建立內部暫存資料表:該暫存資料表可以是只存在於記憶體的memory暫存資料表,或者是儲存於硬碟的myisam暫存資料表;而且初始建立的memory暫存資料表由於表的增大可能會轉變為myisam暫存資料表——其轉化臨界點由max_heap_table_size和tmp_table_size系統變數的較小值決定的!注意:max_heap_table_size系統變數應用於所有的memory引擎的表,不管是使用者暫存資料表、正常表、或者內部暫存資料表。當然程式也可以建立暫存資料表:create temporary table XX; 當然這是程式控制,建立使用完後再刪除,由程式控制了。
以上是讀操作的一些介紹,接下來是寫操作方面的。