内存配置相关参数
前面我們為大家介紹了MYSQL設置參數的作用域,以及如何對全局含有session參數進行配置,下面我們就來具體的看一下參數的配置項,首先我們來看內存相關的參數,前面我們說過,內存的使用對于MYSQL的性能是非常重要的,所以如何正確的配置MYSQL服務器所使用的內存參數,就顯得至關重要了,MYSQL對于內存的使用呢,可以分為兩類來看,一類是我們無法通過配置參數所配置的,如MYSQL服務器運行,解析,查詢,以及內部管理所消耗的內存,這是我們無法通過配置參數所配置的,另一類是我們可以通過配置參數所配置的,如各類的緩沖池所使用的內存,要對MYSQL使用的內存進行配置,我們首先要搞清楚一下幾個問題,確定可以使用的內存的上限,在所有的操作系統上呢,在所有的操作系統上呢,都會存在給MYSQL服務器所使用內存的上限的限制,最根本的一點呢,是我們給MYSQL服務器配置的內存呢是不可以超過本身安裝的物理內存的,不要以為這是開玩笑,沒有人會這樣配置,但是實際上呢,我見過很多這樣配置的情況,比如對于進程內存配置過大時,當MYSQL連接突然增長,就會產生這樣的情況,從而造成MYSQL服務器呢,因為內存溢出而奔潰,但另一方面呢,限制和我們的操作系統架構有關系,比如32位的操作系統,對于一個進程可以使用的內存呢,又是有限制的,因為MYSQL是在單進程下進行的,所以如果使用的是32位操作系統的話,可能只能使用3G以內的內存了,所以之前也建議過大家,對于現在的服務器呢,和操作系統來說,都一定要使用64位架構的,剛才提到了對MYSQL的內存進行配置,我們很容易犯的錯誤就是,給每個連接配置的內存過大,所以第二個要確定的問題就是,確定MYSQL的每個連接使用的內存,MYSQL對于一些緩存,是會對每個連接進行單獨分配的,所以連接數如果越大,內存占用的也就會越多,參數注意主要有以下幾個,首先第一個是排序緩存區的尺寸,這個參數定義了MYSQL每個線程使用排序緩存區的大小,MYSQL并不是在連接初始化時就會每個緩存區分配緩存,而是在有查詢排序操作時,才會為每個緩沖區分配內存,然后重要的是呢,一旦查詢需要排序,MYSQL會立即分配這個參數指定大小的全部內存,而不管該排序是否需要這么大內存,有些時候人們為了某些大的查詢的排序,可以效率高一些,把這個參數直接設置到一個很大的值,比如說100M,如果有100個連接同時進行排序,那么MYSQL就會占用10個G的內存,所以很容易造成服務器內存的溢出,所以大家進行這個參數配置的時候呢,一定要多加小心,那么另一個需要注意的呢,連接緩存區的尺寸,這個參數定義的是,MYSQL的每個線程使用連接緩沖區的大小,對于這個參數需要注意的是,如果一個查詢中關聯了多張表,那么就會為每個關聯分配一個連接緩沖,所以每個查詢可能會有多個連接緩沖,所以這個參數呢,不可能設置的太大,接下來就是read_buffer_size,這個參數指定了當一個MYISAM表進行全表掃描時,所分配的讀緩存池的大小,MYSQL只有在查詢需要時才會被改緩沖分配內存,同樣會分配該參數值大小的內存,另外有一點需要注意的是,參數值的大小呢,一定要是4K的一個倍數,下面這個參數呢,控制的是索引緩沖區的大小,MYSQL也只是在有查詢需要時,才會對該緩沖區分配內存,并且只會分配需要內存的大小,而不是參數指定的大小,一定要記住,以上四個參數,全是為每個線程所分配的,如果我們有100個連接,那就可能分配100倍以上四個參數值內存大小的和,所以以上四個參數配置的過大,很有可能會造成很大的內存浪費,甚至造成MYSQL內存的溢出,而使MYSQL內存奔潰,這一點大家要注意,接下來我們要看看,如何為MYSQL的各種緩沖池來配置內存
那么在這之前呢,我們要先來看看,操作系統保留的內存呢,還包括在同一個服務器上運行的所有其他服務,所需要的內存,以及前面提到的,MYSQL服務器中,我們無法通過參數來控制的,那一部分內存,我推薦大家使用專用的服務器,而不要和其他應用公用一個服務器,因為如果和其他服務器公用一個服務器的話,不可避免的會進行內存的征用,也會給MYSQL配置內存帶來更多的要考慮的因素,另外也有人喜歡在一臺物理服務器上呢,進行多個MYSQL實例,從內存分配上來看,這樣做也并不好,除非是在測試或者是開發環境,這樣做可以解決服務器成本,但是在生產環境中呢,大家最好不要在一臺物理服務器上呢運行多個MYSQL實例,因為這樣也會導致內存IO的征用,從而影響MYSQL服務器的性能,最后對于MYSQL服務器內存的分配呢,需要考慮的就是,如何為緩沖池來分配內存,MYSQL有很多種內存
其中最主要的是以下兩個,一個是innodb_buffer_pool_size,這個參數定義了innodb所使用的緩沖池的大小,這個參數對于innodb存儲引擎的性能呢,是非常重要的,innodb存儲引擎,不僅要緩存索引,同時呢也要緩存數據,哈希索引插入緩沖,鎖,以及其他的內部數據結構,前面提到過,innodb還利用緩存池呢,來幫助延遲寫入,這樣就能合并多個寫入操作,然后一起順序的寫入到磁盤,總之innodb的性能呢嚴重依賴于緩存池,所以我們要保證給他分配了足夠的內存,如果我們在系統中只能使用innodb表,那么innodb的緩存池的大小呢,可以大致用下面的方法呢來計算,也就是總內存減去每個線程所需要的內存,乘以連接數,這是我們前面所介紹的,所有各個線程所需要的內存的總和,乘以我們可能要達到的連接數,再減去系統保留的內存,大致就是我們innodb緩存池的大小了,而在MYSQL手冊中呢,innodb_buffer_pool_size大小呢,應該為服務器內存的97%以上,前面我們提到了,MYSQL是如何使用內存的,所以呢,不能完全按照服務器內存的75%,這樣來配置這個值,我們還必須考慮其他的一些因素,當然了,如果我們當前innodb的數量很小,并且在很長一段時間內呢,增長都是可以預計的話,那就沒有必要把所有的內存呢,分配給Innodb緩沖池,因為緩沖池的內存總量,如果超過innodb表數量,加索引所占的空間的大小呢,那就沒有意義了,如果我們的數據量會快速的增長,就需要innodb緩沖池,多留一些預留空間,因為對于MYSQL5.7之前的版本來說,innodb大小的變更呢,是需要重啟服務器的,所以我們不能隨意的調整innodb緩沖池的大小,而對于innodb緩沖池需要注意的是,很大的緩沖池也使得innodb在關閉的時候需要更多地時間,把緩沖池刷到磁盤上,那另一個和存儲引擎有關的緩沖池呢,key_buffer_size,和innodb_buffer_size不同,這個參數所配置的緩沖池呢,主要是用于MYISAM存儲引擎的,MYISAM存儲引擎只會緩存索引,數據則是依賴操作系統的緩存,所以如果我們的系統存在很多的MYISAM表的話,和innodb表一樣,超過緩沖池大小的配置呢,我們可以通過下面的查詢知道MYISAM表,索引所占空間的大小,這里有一點需要注意的就是,就算我們系統中使用的全都是innodb表,也還是要給key_buffer_size來分配一定的空間,就是MYSQL的系統表呢,目前還是在使用MYISAM存儲引擎,以上就是配置參數,以上的參數一定要根據我們的實際情況來進行調整,所以不可能存在一個通用的配置項
?
總結
- 上一篇: MySQL服务器参数介绍
- 下一篇: IO相关配置参数