MySQL-性能优化_影响MySQL性能的因素分析及解决方案
文章目錄
- 生猛干貨
- 官方文檔
- 影響性能的幾個因素
- CPU
- 內存
- 磁盤的配置和選擇
- 傳統的機械硬盤
- RAID
- SSD 或者 PCIe卡
- 網絡存儲SAN (光纖傳輸)和 NAS (帶寬傳輸)
- 網絡
- 操作系統
- 內核相關參數 `/etc/sysctl.conf`
- 資源限制的配置文件 /etc/security/limits.conf
- 磁盤調度策略
- 文件系統
- 搞定MySQL
生猛干貨
帶你搞定MySQL實戰,輕松對應海量業務處理及高并發需求,從容應對大場面試
官方文檔
https://dev.mysql.com/doc/
如果英文不好的話,可以參考 searchdoc 翻譯的中文版本
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
影響性能的幾個因素
-
硬件資源(CPU 、內存、磁盤等)
-
操作系統的區別
-
MySQL的存儲引擎的選擇
MyISAM: 不支持事務,表級鎖
InnoDB: 事務級存儲引擎,完美支持行級鎖,事務ACID特性。但 比不是說 MyISAM比InnoDB差,看使用場景
-
數據庫參數設置
-
數據庫結構設計和SQL語句 ,毫無疑問 這個是最最重要的因素 —> mysql 可以開啟慢查詢監控耗時長的SQL
CPU
更多的CPU or 更快的CPU ?
主要從以下幾個方面考慮:
- (1)CPU密集型的應用?
分析下我們的應用的類型,是的話,要提高SQL的運行效率,那就需要更快的CPU。
還有一點需要注意 MySQL不支持多CPU對同一SQL的并發處理,也就是說一個SQL只能運行在一個CPU的核上。
- (2) 系統的并發量如何 ?
一個SQL只能跑在一個CPU上,如果有32個CPU呢 ,是不是同時可以跑32個SQL呢? 就是我們前面說的QPS 。 一般web應用,CPU的核心數量比CPU的主頻更重要。
- (3) MySQL的版本 ?
5.6、 5.7以上的版本,對多核CPU的支持更好。
- (4) 64位操作系統 OR 32位操作系統
32的操作系統,進程所能尋址的最大內存也就4G。
總結
- 對于并發較高的場景,CPU的數量比頻率重要
- 對CPU密集型場景和復雜的SQL 頻率越高越好
內存
MyISAM : 索引 緩存在內存 ,數據通過OS來緩存
InnoDB : 索引和數據都是通過內存來緩存
舉個例子, 100G的數據量, 內存64G,這個時候增加內存對性能有提高。 如果內存是256G,還是慢,那就是其他問題了。
當然了,內存多了,對于數據的讀和寫都是好處的,都可以利用緩存來提高讀寫性能。
如何選擇內存呢? ----> 建議選擇主板支持的最大內存頻率, 跟CPU一個道理。
內存的型號,保持一致, 單個內存盡可能的大,都是比較好的選擇。
配置的時候,要考慮數據的增長,比如100G的數據, 128G內存可能已經滿足了要求,但數據可能增長較快,這個時候256的更佳。
總結
- 選擇主板所能使用的最高頻率的內存
- 內存盡可能的多
磁盤的配置和選擇
主流的4種
- 使用傳統的機械硬盤
- 使用RAID增強傳統硬盤的性能
- 使用固態存儲SSD和PCIe卡
- 使用網絡存儲NAS和SAN
傳統的機械硬盤
傳統的機械硬盤的讀取數據的過程
考慮的話 1. 存儲容量 2.傳輸速度 3 訪問時間 4 主軸的轉速(常見的7200轉、1萬5千轉等等) 5. 物理尺寸
RAID
RAID : 磁盤冗余隊列 (Redundant Arrays of Independent Disks )
RAID是一種將多個容量較小的磁盤組成一組容量更大的磁盤,并提供數據冗余來保證數據完整性的技術 。
Linux-Raid0、Raid1、Raid5、Raid10初探
SSD 或者 PCIe卡
SSD
- 比普通的機械盤有更好的隨機讀寫性能
- 支持更好的并發, I/O 性能好
- 缺點: 長時間密集的寫,容易造成損壞
特點:
- 可以使用SATA接口,可以替換傳統的磁盤而不需要任何的改動。
- SATA接口的SSD同樣支持RAID
- SATA的SSD 3.0 接口如果放到了 2.0接口上,受2.0接口的性能影響,性能會下降
舉個例子 SATA3.0接口 6Gbps , 放到SATA2.0接口上 最多只能用到2.0的 3Gbps
PCIe 卡(Fushion IO)
- 無法使用SATA接口,需要獨特的驅動和配置
- 比SSD性能好,但價格也比SSD貴
- PCIe 也會吃服務器的內存
- 支持PCIe的Raid控制器比較少,而且成本相當高
固態存儲使用的場景
- 大量隨機I/O的場景
- 解決單線程負載的I/O 瓶頸
舉個例子
主從節點的MYSQL, 有一個SSD, 給哪個節點用呢 ?
----> 從節點 上用。 主節點上寫 ,是多線程, 從節點的復制,單線程,為了減少延遲,建議放到從服務器上。
網絡存儲SAN (光纖傳輸)和 NAS (帶寬傳輸)
SAN: Storage Area Network
NAS: Network Attached Storage
是兩種外部文件存儲設備加載到服務器上的方法。
SAN設備通過光纖連接服務器,設備通過塊接口訪問,服務器可以將其當做硬盤使用。 可以承受大量的順序讀寫,但隨即讀有的時候不如RAID
NAS 使用 寬帶來傳輸,有延遲。
使用場景的話: 數據備份等 。
總結
- PCIe > SSD > Raid10 > 本地磁盤 > NAS
網絡
網絡帶寬 —> 低延時 、吞吐量達
網絡質量—> 少抖動
建議
- 采用高性能和高帶寬的網絡接口設備和交換機
- 對多個網卡進行綁定,增強可用性和帶寬
- 盡可能的進行網絡隔離
操作系統
windows 和 linux , 大小寫的區別,可以通過修改MySQL的配置來調整。
以CentoOS為例來了解下系統的參數優化
內核相關參數 /etc/sysctl.conf
如需增加 可以直接追加到該文件的末尾
TCP/IP及內核參數優化調優
net.core.wmen_default = 87380 # 表示內核套接字發送緩存區默認的大小。 net.core.wmen_max = 16777216 # 表示內核套接字發送緩存區最大大小。 net.core.rmem_default = 87380 # 默認的TCP數據接收緩沖 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 # (4G)單個共享內存段的最大值,應該設置的足夠大,以便能在一個共享段下容納整個Innodb緩沖池的大小 。 可以取物理內存-1 byte vm.swappiness = 0 # 除非虛擬內存滿了,否則不會使用交換分區其實就是swap交換分區的設置, 當操作系統沒有足夠的內存時,就會將一些虛擬內存寫到磁盤的交換區中,這樣就會發生內存交換。
然后執行sysctl -p命令,使上述修改生效
資源限制的配置文件 /etc/security/limits.conf
# 文件句柄數量 * soft nofile 65535 * hard nofile 65535 * 對所有用戶生效 soft 當前系統生效的設置 hard 系統所能設置的最大值 nofile 表示所限制的資源是打開文件的最大數目 65535 限制的數目這倆參數,重啟系統才生效。
磁盤調度策略
I/O 調度算法再各個進程競爭磁盤I/O的時候擔當了裁判的角色,以求得盡可能最好的整體I/O性能。
在linux下面列出4種調度算法
- CFQ (Completely Fair Queuing 完全公平的排隊)(elevator=cfq) 默認策略
- Deadline (elevator=deadline): 試圖把每次請求的延遲降至最低
- NOOP (elevator=noop):FIFO隊列形式處理
- Anticipatory (elevator=as):對讀操作優化服務時間,在提供一個I/O的時候進行短時間等待,使進程能夠提交到另外的I/O。
文件系統
windows -----> FAT 和 NTFS
WinServer 只有 NTFS 這種可以選擇
Linux —> EXT3 EXT4 XFS
EXT3 EXT4系統的掛載參數 /etc/fstab
# data的可配置選項data=writeback | ordered |journal noatime nodiratime /dev/sda1/ext4 noatime,nodiratime,data-writeback 1 1搞定MySQL
總結
以上是生活随笔為你收集整理的MySQL-性能优化_影响MySQL性能的因素分析及解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL-性能优化_大表和大事务的常用
- 下一篇: Linux-Raid0、Raid1、Ra