硬件對數據庫性能優化帶來的影響

  • 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轉沒費中,然而,傳統機械硬盤最大的問題在於讀寫磁頭,讀寫磁頭的設計使得硬盤可以不再像磁帶一樣,只能順序訪問,而是可以隨機訪問,但是隨機訪問的速度很慢,要話費大量的時間來進行磁頭旋轉和定位。

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