1. 程式人生 > >深入淺出MySQL 第22章 磁碟I/O問題

深入淺出MySQL 第22章 磁碟I/O問題

對於比較大的資料庫,磁碟I/O 一般總會成為資料庫的一個性能瓶頸

SQL優化,資料庫物件優化,資料庫引數優化,以及應用程式優化等,大部分都是想用過減少或延緩磁碟讀來減輕磁碟I/O的壓力及其對效能的影響.
解決磁碟I/O問題,減少或延緩磁碟操作是一重要方面,但磁碟I/O是不可避免的,因此,增強磁碟I/O本身的效能和吞吐量也是一個重要方面.
以下涉及到磁碟陣列,符號連結,裸裝置等更底層的方面

1.磁碟陣列
RAID Redundant Array of Inexpensive Disks 翻譯為’廉價磁碟冗餘陣列’,也就是磁碟陣列.
RAID就是按照一定策略將資料分佈到若干物理磁碟上
=>增強資料儲存的可靠性,提高資料讀寫的整體效能(通過分佈實現了資料的’並行’讀寫)

2.常見RAID級別及其特性

上
2

3.如何選擇RAID級別
1.資料讀寫都很頻繁,可靠性要求也很高,最好選擇RAID 10;
2.資料讀很頻繁,寫相對較少,對可靠性有一定要求,可以選擇RAID 5;
3.資料讀寫都很頻繁,但可靠性要求不高,可以選擇 RAID 0;

4.虛擬檔案卷或軟RAID
模擬實現RAID的特性,利用作業系統中提供的軟體包.

  1. 使用Symbolic Links (符號連結)分佈I/O
    MySQL的資料庫名和表名是與檔案系統的目錄名和檔名對應的,預設情況下,建立的資料庫和表都存放在引數datadir定義的目錄下.這樣如果不適用RAID 或邏輯卷,所有的表都存放在一個磁碟裝置上,無法發揮多磁碟並行讀寫的優勢!在這種情況下,我們可以利用作業系統的符號連結,將不同的資料庫或表,索引指向不同的物理磁碟,從而達到分佈磁碟I/O的目的

ps:使用Symbolic links存在一定的安全風險,如果不使用Symbolic links,應通過啟動引數skip-symbolic-links禁用這一功能

6.禁止作業系統更新檔案的atime屬性
atime 是linux/unix 系統下的一個檔案屬性,每當讀取檔案時,作業系統都會將讀操作發生的時間回寫到磁碟上.對於讀寫頻繁的資料庫檔案來說,記錄檔案的訪問時間一般沒有任何用處,卻會增加磁碟系統的負擔,影響I/O的效能!因此,可以通過設定檔案系統的mount屬性,阻止作業系統寫atime資訊,以減輕磁碟I/O的負擔.
linux:
修改檔案系統配置檔案/etc/fstab,指定noatime選項

LABEL=/home /home ext3 noatime 1 2

然後重新mount檔案系統

#mount -oremount /home

這樣以後讀/home 下檔案就不會再寫磁碟了

7.用裸裝置(Raw Device) 存放InnoDB的共享表空間
MyISAM儲存引擎有自己的索引快取機制,但資料檔案的讀寫完全依賴於作業系統,作業系統磁碟I/O快取對MyISAM表的存取很重要.
但InnoDB儲存一起拿與MyISAM不同,它採用類似Oracle的資料快取機制來Cache索引和資料,作業系統的磁碟I/O快取對其效能不僅沒有幫助,甚至還有反作用.因此,在InnoDB快取充足的情況下,可以考慮使用Raw Device來存放InnoDB共享表空間
raw device