mysql記憶體使用以及優化中需要的幾點注意

2021-06-12 07:44:06 字數 2282 閱讀 1866

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)適當對錶中字段進行冗餘。比如說,把乙個文章的摘要,與文章資訊表放在一起,而不是跟文章詳細內容表放在一起。

結構體使用以及函式優化

通過學習高博一起做rgbdslam系列,體會到乙個工程專案由簡單到複雜的過程,列出自己認為重要的地方 1.將一些相關的變數封裝到結構體中,歸類之後一是方便觀察,二是處理起來很有條理 2.將寫好,不經常改動的函式寫到新的檔案中,通過鏈結庫以及包含標頭檔案來實現呼叫函式 3.專案要引用到的引數,可以專門...

Hive語言的使用,以及效能優化

hive出現的原因 解決從乙個現有的資料基礎架構轉移到hadoop上,hive適合資料倉儲應用程式的,可以維護海量資料,而且可以對資料進行挖掘,形成報告。查詢hadoop集群中的資料 1 hive的查詢語言,用來查詢hadoop中的資料,hive是將大多數的查詢轉換為mapreduce任務 2 hi...

讀寫鎖的使用以及降級優化

讀寫鎖的形式如下 readwritelock readwritelock newreentrantreadwritelock lock readlock readwritelock.readlock lock writelock readwritelock.writelock 1.讀讀共享 vola...