MySQL記憶體使用量以及最佳化中需要的幾點注意

來源:互聯網
上載者:User

MySQL記憶體使用量以及最佳化中需要的幾點注意
1、從記憶體中讀取資料是微秒層級的。而從磁碟讀則是毫秒層級的。二者相差一個數量級。所以想最佳化資料庫,第一個要做到的就是最佳化io。
2、key_buffer_size[global]設定的記憶體地區大小緩衝了myisam表的索引。由於myisam只緩衝索引在記憶體中,並不快取資料在記憶體,所以如果記憶體允許,要讓這個參數足夠能容納所有myisam的所有索引來提高效能。另外,在myisam表上,盡量讓所有的查詢條件都限制在索引上,以便能讓緩衝替我們提高尋找效率。
3、bulk_insert_buffer_size[thread]僅僅用在myisam中,用於在插入資料的時候臨時快取資料。當我們使用如下的寫入語句的時候,會使用這個記憶體地區協助批量寫入資料檔案:
insert ... select ...
insert into ... values ...
load data infile ... into ...
4、innodb_buffer_pool_size[global]當我們使用innodb引擎的時候這個參數也許是影響效能最為關鍵的一個參數了。它用來設定緩衝innodb的索引以及資料區塊的記憶體地區大小。
簡單來說,我們操作innodb表的時候,返回的所有資料以及去尋找資料的過程中所用到的所有索引,都會在這個記憶體塊中走一遭。
5、innodb_additional_mem_pool_size[global]設定了innodb儲存引擎用來存放資料字典資訊以及一些內部資料結構的記憶體地區大小。所以,當我們一個mysql instance中
包含有很多資料庫物件(比如很多表的時候)的時候需要適當調整該參數的大小以確保所有的資料都在記憶體中,以確保效率。這個參數的記憶體是否足夠還是比較容易知道的。因為當過小的時候
mysql會記錄warning到error log中的。
6、innodb_log_buffer_size[global]innodb事務所使用的記憶體。innodb在寫交易記錄的時候,為了提高效能,先寫入緩衝,再寫到logfile中。
7、innodb_max_dirty_pages_pct[global]用來控制在innodb的buffer pool中,可以不用寫入資料檔案的dirty page(已經被修改,但是還沒寫入到資料檔案的髒資料)的比例。
這個值越大,從記憶體到磁碟的寫入操作就會減少。所以能夠一定程度減少磁碟io。但是當這個值很大的時候,如果資料庫crash,那麼重啟的時間可能就會很長。因為會有
大量的交易資料需要從記錄檔中恢複出來寫入到資料檔案中。同時,過大的比例值,也會造成當達到比例設定的上限之後,flush操作寫入資料“過猛”,造成效能波動劇烈。
8、當我們要取出全表大部分的資料的時候 ,索引掃描不一定優於全表掃描。
9、mysql是基於行的資料庫,而資料讀取則是基於page的。每個page中存放有行。如果每一行的資料量都減小,那麼每個page裡面存放的行就增多了。每次io就能偶取出更多的行。
反過來,處理相同的資料,處理的page就會減少。也即是io次數的降低。直接提升效能。此外,由於我們的記憶體數量是有限的,那麼每個page中行數增多了,就等於增加了
每個資料區塊的快取資料量,也能夠提升命中率。
10、我們無法改變要儲存什麼資料,但是怎麼儲存資料我們可以花一些心思。
1)數字類型。萬不得已,不要用double類型。除了佔用空間比較大之外,還有精度問題。同樣,固定精度的小數也不要使用decimal,建議乘以固定倍數,轉換成整數進行儲存。
可以節省儲存空間,而且不用任何附加維護成本。對於整數的儲存,建議分開tinyint/int/bigint,他們儲存資料佔用空間有一定差距。
2)字元類型。萬不得已,不要用text類型。它的處理效率低於char和varchar。定長欄位建議char類型。變長用varchar。varchar切不可以隨意給一個很大的長度。因為不一樣的長度範圍,mysql會有不同的處理。在部落格中有一篇是介紹varchar的處理方式的。假設聲明了varchar(1000),那麼,mysql在磁碟中儲存這個資料的時候,假設資料長度45,那麼磁碟中就佔用大概45左右的空間。但是當這個資料在記憶體中的時候還是要佔用1000個空間的。浪費了很多。
3)事件類型。盡量使用timestamp。儲存空間佔用只是datetime類型的一半。對於需要精確到某一天的類型,建議使用date類型。因為它儲存需要三個位元組。比timestamp還少。
不建議使用int來儲存一個unix timestamp,不直觀,不會帶來任何好處。
4)適當對錶中欄位進行冗餘。比如說,把一個文章的摘要,與文章資訊表放在一起,而不是跟文章詳細內容表放在一起。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.