1. 程式人生 > >MySQL優化(二)——什麼影響了MySQL效能

MySQL優化(二)——什麼影響了MySQL效能

影響效能的幾個方面:

  1. 伺服器硬體
  2. 伺服器系統
  3. 資料庫儲存引擎的選擇
  4. 資料庫引數配置
  5. 資料庫結構設計和SQL語句

一、伺服器硬體

1、CPU的選擇

我們的應用是否是CPU密集型的

對於cpu密集型的應用,我們需要加快sql語句的處理速度。由於mysql的sql語句處理是單執行緒的,因此我們需要更好的cpu,而不是更多的cpu。

我們系統的併發量如何

一個cpu同時只能處理一條sql語句。所以,高併發量的情況下,就需要更多的cpu而不是更快的cpu。

選擇32位還是64位的cpu

64位已經是預設配置了。

2、記憶體的選擇

記憶體的io要遠高於磁碟,即便是SSD或者Fusion_IO。所以把資料快取到記憶體中讀取,可以大大提高效能。
常用的mysql引擎中,MyISAM把索引快取到記憶體,資料不快取。而InnoDB同時快取資料和索引。

快取不僅對讀取有益,對寫入也是可以優化的,我們可以通過快取,將多次寫入合併成一次寫入操作。

怎麼選擇記憶體:主頻儘量大,型號儘量相同,單條記憶體容量儘量打。

3、磁碟的選擇

  • 傳統機械磁碟
  • RAID增強傳統機械磁碟
  • 固態儲存SSD和PCIe卡
  • 網路儲存NAS和SAN

如何選擇傳統機械硬碟

  • 儲存容量
  • 傳輸速度
  • 訪問時間
  • 主軸轉速
  • 物理尺寸:越小效能越高,儲存空間越小

RAID增強

什麼是RAID:把多個容量小的磁碟組成一組容量更大的磁碟,並提供資料冗餘來保證資料完整性的技術。

RAID 0,多磁碟串聯。成本最低,資料容易丟失
RAID 1,映象。磁碟利用率降低一半。
RAID5,分散式奇偶校驗磁碟陣列
RAID10,分片映象

等級 特點 是否冗餘 盤數
RAID0 便宜,快速,危險 N
RAID1 高速讀,簡單,安全 2
RAID5 安全,成本這種 N+1 取決於最慢的盤
RAID10 貴,高速,安全 2N

推薦RAID10

固態儲存

相比機械磁碟,固態磁碟有更好的隨機讀寫效能。
相比機械磁碟,固態磁碟能更好的支援併發。
相比機械磁碟,固態磁碟 更容易損壞

  • SSD:
    1.使用SATA介面。可以替換傳統磁碟而不需任何改變
    2.SATA介面的SSD同樣支援RAID技術。注意SSD的RAID控制器與傳統不同。
  • PCI-E
    1.無法使用SATA介面,需要獨特的驅動和配置
    2.價格相對於SSD要貴,但是效能比SSD更好

固態儲存的使用場景:
1.適用於存在大量的隨機I/O的場景。
2.適用於解決單執行緒負載的I/O瓶頸。

網路儲存

SAN:通過光釺連結伺服器,伺服器可以將其當做硬碟使用。適合大量順序讀寫
NAS:使用網路連線,通過基於檔案的協議如NFS或SMB來訪問。

網路儲存適合的場景:

  • 資料庫備份

4、網路效能的影響

延遲、頻寬(吞吐)

網路頻寬的影響,不必多說。可能很多人認為資料庫伺服器與Web伺服器的通訊是在內網下的,頻寬影響不大。其實在大促的情況下,我們有50臺伺服器,同時向資料庫請求2M的資料,那麼就需要100M的帶寬了。
建議:

  • 採用高效能和高頻寬的網路介面裝置和交換機。
  • 對多個網絡卡進行繫結,增強可用性和頻寬。
  • 儘可能的進行網路隔離。

5、伺服器硬體對效能的影響,總結

  • cpu
    1、64位的cpu一定要工作在64位的系統下。
    2、對於併發比較高的場景,cpu的數量比頻率重要
    3、對於cpu密集型場景和複雜SQL則頻率越高越好。

  • 記憶體
    1、選擇主機板所能使用的最高頻率的記憶體
    2、記憶體的大小對效能很重要,所以儘可能的大

  • I/O子系統
    PCIe–>SSD–>Raid10–>磁碟–>SAN

二、伺服器系統

MySql適合的作業系統

  • Windows
  • FreeBSD
  • Solaris
  • Linux

下面的內容以CentOs系統為例

系統引數優化

核心相關引數(/etc/sysctl.conf)

網路相關
- net.core.somaxconn=65535

    對於一個TCP連線來說,伺服器端和客戶端需要進行三次握手來建立網路的連線。當三次握手成功之後,我們可以用netstat命令檢視埠的狀態由監聽轉變成了連線,接著該連線就可以傳輸資料了。對於一個監聽狀態的埠,都會有自己的監聽佇列,而該引數就決定了監聽佇列的最大長度。

- net.core.netdev_max_backlog=65535
- net.ipv4.tcp_max_syn_backlog=65535

加快tcp連線的回收

  • net.ipv4.tcp_fin_timeout=10
  • net.ipv4.tcp_tw_reuse=1
  • net.ipv4.tcp_tw_recycle=1

tcp連線接收和傳送緩衝區大小的預設值和最大值

  • net.core.wmem_default = 87380
  • net.core.wmem_=16777216
  • net.core.rmem_default=87380
  • net.core.rmem_max=16777216

檢測佔用的tcp連線是否已經失效

  • net.ipv4.tcp_keepalive_time=120 傳送時間
  • net.ipv4.tcp_keepalive_intvl=30 沒有返回再次傳送的間隔
  • net.ipv4.tcp_keepalive_probes=3 傳送幾次

記憶體相關引數

  • kernel.shmmax = 4294967295

注意:
1、這個引數應該設定的足夠大,以便能在一個共享記憶體段下容納下整個的Innodb緩衝池大小
2、這個值的大小對於64位linux系統,可取的最大值為實體記憶體值-1byte,建議值為大於實體記憶體的一半,一般取值大於Innodb緩衝池大小即可。

  • vm.swappiness=0
    這個引數當記憶體不足時會對效能產生比較明顯的影響。

    拓展:
    Linux系統記憶體交換區:在linux系統安裝時都會有一個特殊的磁碟分割槽,稱之為系統交換分割槽。如果我們使用free-m在系統中檢視可以看到類似下面內容,其中swap就是交換分割槽。
    

    這裡寫圖片描述

    當作業系統因為沒有足夠的記憶體時就會將一些虛擬記憶體寫到磁碟的交換區中,這樣就會發生記憶體交換
    

在MySQL伺服器上是否要使用交換分割槽有一些爭議:

-主張 完全禁用 的風險:
1、降低作業系統的效能
2、容易造成記憶體溢位,崩潰,或都被作業系統kill掉

結論:在MySQL伺服器上保留交換分割槽,但是要控制何時使用。vm.swappiness=0就是告訴Linux核心除非虛擬記憶體完全滿了,否則不要使用交換區。

增加資源限制(/etc/security/limit.conf)
這個檔案實際上是linux PAM也就是插入式認證模組的配置檔案。
其中重要的配置是:開啟檔案數的限制。

  • * soft nofile 65535
  • * hard nofile 65535

其中:*表示對所有使用者有效,soft指當前系統生效的設定,hard表明系統中所能設定的最大值,nofile表示所限制的資源是開啟檔案的最大數目,65535就是限制的數量。

結論:把可開啟的檔案數量增加到65535,以保證可以開啟足夠多的檔案控制代碼。
注意:這個檔案的修改需要重啟系統才可以生效。

磁碟排程策略(/sys/block/devname/queue/scheduler)

  • noop anticipatory deadline [cfq]
    檢視:cat /sys/block/sda/queue/scheduler

noop(電梯式排程策略)

    noop實現了一個FIFO佇列,它像電梯的工作方法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合併到最近的請求之後,以此來保證請求同一介質。

deadline(截止時間排程策略)
對資料庫最好。

修改磁碟排程策略

echo deadline > /sys/block/sda/queue/scheduler

檔案系統的選擇

windows:
- FAT
- NTFS

linux:

  • EXT3
  • EXT4
  • XFS(效能更高)

三、儲存引擎

MySQL體系結構

這裡寫圖片描述

注意:儲存引擎是針對於表的而不是針對於庫的(一個庫中的不同表可以使用不同的儲存引擎)

MyISAM

MySql5.5之前版本預設儲存引擎。
MyISAM儲存引擎表有MYD和MYI組成。

特性:

  • 併發性與鎖級別:對讀寫混合的併發性並不會太好
  • 表損壞修復
  • 支援的索引型別:全文索引
  • 支援壓縮:壓縮表只支援讀操作,不支援寫操作

適用場景:

  • 非事務型應用
  • 只讀類應用
  • 空間類應用

★Innodb

系統表空間 和 獨立表空間的選擇

比較:

  • 系統表空間無法簡單的收縮檔案大小
  • 獨立表空間可以通過optimize table命令收縮系統檔案
  • 系統表空間會產生IO瓶頸
  • 獨立表空間可以同時向多個檔案重新整理資料

建議:對Innodb使用獨立表空間

如何把原來存在於系統表空間中的錶轉移到獨立表空間中?

  • 1、使用mysqldump匯出所有資料庫表資料
  • 2、停止MySql服務,修改引數,並刪除Innodb相關檔案
  • 3、重啟MySql服務,重建Innodb系統表空間
  • 4、重新匯入資料

Innodb儲存引擎的特性

  • 事務性儲存引擎
  • 完全支援事務的ACID特性
  • Redo Log 和 Undo Log
  • Innodb支援行級鎖(MyISAM支援表級鎖),行級鎖可以最大程度的支援併發,行級鎖是由儲存引擎層實現的

Innodb適用場景
基本上只要不使用到Innodb不包含的功能,基本上都使用Innodb作為預設儲存引擎(例如MyISAM的空間應用,全文索引。但實際上MySql5.7之後Innodb已經支援了前面兩點)。