程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql innodb的學習(一)

mysql innodb的學習(一)

編輯:MySQL綜合教程


mysql innodb的學習(一)   mysql下最常用的兩個存儲引擎一個是Myisam,另一個是innodb,關於這兩個引擎的區別和比較,網上有好多,這裡就不再說明了,這裡主要講一下innodb的各個參數的作用和對性能的影響。其中對性能影響最明顯的兩個參數innodbbufferpoolsize和innodblogfilesize。   www.2cto.com   innodbbufferpool_size 這個參數可以說是對innodb的性能有著決定性的作用,緩沖區的大小決定了innodb性能的好壞。緩沖區不僅緩存innodb的索引,還存儲了數據、自適應哈希索引(adaptive hash index)、插入緩存、鎖、以及其他的一些內部結構。這個值的大小怎麼設置呢,設置多大才合適呢,mysql的配置文件中給出的建議是設置為服務器內存的50%-80%,但是在32位的機器中,mysql的手冊中有一個警告:  www.2cto.com     在32位GNU/Linux x86上,你必須要小心不要設置過高的內存用量。glibc可能允許進程堆積在線程堆棧上發展,它會造成你的服務器崩潰。如果下列表達式的值接近或者超過2GB,系統會面臨危機:innodbbufferpool_size + keybuffersize(myisam使用的緩沖區)+ maxconnections*(sortbuffersize+readbuffersize+binlogcachesize)+ maxconnections*2MB   innodb使用這個緩沖區來延緩write,所以可以將多個write合並,然後順序的寫到disk中,這樣可以將原來的隨機寫改進到順序寫,提高數據寫的效率。 innodb對寫操作的執行過程為先將寫操作的改動寫到buffer pool中,然後記錄操作日志到log file(日志文件的配置參數為innodblogfile_size)中,然後就返回結果到客戶端,這樣就提高了innodb的響應速度(不需要等寫到磁盤後再返回,在內存中的操作會比在磁盤上的操作快),而在buffer pool改動過的記錄就是“髒數據(髒頁)dirty page”。 那接下來問題就來了:   innodb是怎麼把buffer pool中的“髒頁”寫到磁盤的呢? innodb的緩沖區中能保存多少dirty page呢? 對於第一個問題,innodb使用一個後台的線程來刷新(flush)數據到磁盤(將多個寫操作合並執行,可以將隨機寫改為順序寫來提高效率) 對於第二個問題,innodb中使用參數innodbmaxdirtypagespct來控制dirty page在buffer pool中的最大比例,當達到這個值時,innodb就會使用flush thread來將數據寫到磁盤(如何寫將在後續中討論),當沒有達到這個值時,innodb的flush線程會在buffer pool中沒有足夠的空間來寫新數據時執行flush的操作,這個行為稱為“懶執行(lazy)”,就是innodb可以延遲flush操作。 延遲執行不代表就不執行了,因為如果在服務器壓力比較大的情況下(有大量的並發寫),buffer pool中就會有很多的dirty page,那麼就會很容易達到innodbmaxdirtypagespct,那麼flush thread就會要盡量快將buffer pool中dirty page刷新到磁盤中,以降低髒頁在緩沖區中的比例。   雖然buffer pool對innodb的性能有很大影響,但是也不是越大越好,越大的緩沖區對mysql服務的關閉和啟動就要執行越長的時間。比如緩沖區中有很多的“髒頁”,innodb要花相對長的時間來將髒頁刷新到磁盤中,只有等所有的髒頁都刷新後,mysql才會關閉。當然也可以使用快速關閉,但是啟動的時候,mysql要花相對長的時間來恢復,所以對於關閉和啟動這整個流程來說,大的緩沖區還是對這整個流程的時間來說要相對長。 我們可以在mysql運行過程中動態的調整innodbmaxdirtypagespct值,動態的設置相對小一些,可以是flush線程盡快的將髒頁刷新到磁盤,後再執行關閉的操作,這樣可以從某一方面來說縮短關閉的時間。我們可以通過SHOW INNODB STATUS命令來查看當前髒頁的數據innodbbufferpoolpagesdirty。   如果我們有一個大的緩沖區和一個慢的磁盤,那麼服務器重啟時就會要花一個相對長的時間來預熱,這個對於mysql的整體性能也會有一定的影響。  

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