當前位置:成語大全網 - 新華字典 - MySQL內存使用以及優化中需要的幾點註意

MySQL內存使用以及優化中需要的幾點註意

1、從內存中讀取數據是微秒級別的。而從磁盤讀則是毫秒級別的。二者相差壹個數量級。所以想優化數據庫,第壹個要做到的就是優化i

[thread]僅僅用在myisam中,用於在插入數據的時候臨時緩存數據。當我們使用如下的寫入語句的時候,會使用這個內存區域幫助批量寫入數據文件:insert ... select ...insert into ... values ...load data infile ... into ...[global]設置了innodb存儲引擎用來存放數據字典信息以及壹些內部數據結構的內存區域大小。所以,當我們壹個mysql instance中包含有很多數據庫對象(比如很多表的時候)的時候需要適當調整該參數的大小以確保所有的數據都在內存中,以確保效率。這個參數的內存是否足夠還是比較容易知道的。因為當過小的時候mysql會記錄warning到error log中的。[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)適當對表中字段進行冗余。比如說,把壹個文章的摘要,與文章信息表放在壹起,而不是跟文章詳細內容表放在壹起。