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