硬體對資料庫性能優化帶來的影響

  • 2019 年 11 月 6 日
  • 筆記

硬體對資料庫性能優化帶來的影響

資料庫性能優化不是一個簡單的任務,不僅僅是SQL層面的優化,它的關鍵在於對innodb存儲引擎的了解,當然,好的存儲引擎性能離不開好的硬體系統的支撐,這裡我們從cpu,記憶體,磁碟等方面展開討論

當前的資料庫應用類型一般分為兩個大類,分別是OLTP(online Transaction Process,在線事務處理)和OLAP(Online Analytical Processing,在線分析處理)兩大類,這是兩種截然不同的資料庫應用,OLAP多用在數據倉庫中,一般需要執行複雜的SQL語句來進行查詢,OLTP多用在日常的事務處理中,例如銀行交易、在線商品交易、blog、網遊等等。相對於OLAP,OLTP的數據量一般比較小,下面我們看看不同的硬體對於這兩種應用類型的影響。

CPU層面:

Innodb存儲引擎一般都應用與OLTP的資料庫應用,這種應用的特點如下:

用戶的操作並發量大;

事務處理的時間一般比較短;

查詢的語句較為簡單,一般都走索引;

可以看出,OLTP的應用本身對CPU的要求並不高,因為複雜的查詢可能需要執行比較、排序、連接查詢等非常消耗CPU的操作,而這些操作在OLTP的資料庫應用中較少發生。因此,我們把OLAP的應用稱之為CPU密集型,而OLTP的應用稱之為IO密集型,建議在OLTP應用的伺服器配置上,將更多的之以禮放在提高IO的配置上,換句話說,在OLTP應用中,磁碟IO交互速度的重要性大於CPU核數。當然,如果可以,還是應該儘可能的配置好的CPU,我們知道,InnoDB的存儲引擎主要的後台都是通過後台的執行緒來進行相關操作的,Innodb1.2版本之後,purge執行緒已經可以支援多個,如果採用多核心的CPU,可以通過修改MySQL中的參數Innodb_read_io_threads和innodb_write_io_threads來增大IO的執行緒,從而提高資料庫的性能。OLTP的資料庫應用操作一般比較簡單,但是在高並發的場景下,多個CPU或者多核心的CPU更加合適。

記憶體方面:

記憶體的大小最能直接反應資料庫的性能。一旦記憶體不夠用,將會出現肉眼可見的性能問題,我們知道innodb存儲引擎既快取數據,也快取索引,並且將它們都快取在一個很大的緩衝池中,也就是常說的Innodb Buffer Pool,Percona公司已經實驗證明了,隨著快取池的增大,資料庫的TPS會直線增加,直到快取池的大小已經大於數據文件本身的大小,所有對數據文件的操作都可以在記憶體中進行,這個時候的資料庫性能是最優的,再持續增加快取池並沒有顯著的提高。

當然,這裡需要注意一點,緩衝池的大小大於數據文件的大小時,並不意味著當前資料庫已經沒有磁碟操作了,所有的數據都在記憶體中進行交互。資料庫的緩衝池只是用來存放熱點數據的區域,後台的執行緒還負責將臟頁非同步的刷新到磁碟中,此外,每次事務提交的時候,還需要和磁碟交互將redo log寫入redo log 文件。

磁碟方面:

當前大多數資料庫都採用的是SAS或者SATA介面的硬碟,傳統的機械硬碟有兩個重要的指標,一個是尋道時間,一個是轉速,當前,機械硬碟的尋道時間已經可以做到3ms,轉速為15000轉沒費中,然而,傳統機械硬碟最大的問題在於讀寫磁頭,讀寫磁頭的設計使得硬碟可以不再像磁帶一樣,只能順序訪問,而是可以隨機訪問,但是隨機訪問的速度很慢,要話費大量的時間來進行磁頭旋轉和定位。

固態硬碟解決了傳統硬碟的瓶頸,固態硬碟沒有傳統機械硬碟的讀寫磁頭,內部由快閃記憶體組成,它具有低延遲,低功耗的優點,可以提供一致的隨機訪問時間。現在企業內一般使用並聯多塊快閃記憶體來進一步提高數據傳輸的吞吐量。當然,固態硬碟也不是沒有缺點,固態硬碟中的快閃記憶體數據不可以更新,只能進行擦除操作,而這個擦書比較耗時,而且有次數限制。因此,在使用固態硬碟的時候,應該好好利用它的存儲性能,避免過多的寫入操作。