這篇文章主要介紹MYSQL進(jìn)階怎么學(xué),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)建站是一家從事企業(yè)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、成都網(wǎng)站制作、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)1000多家。文章目錄
1 影響性能的幾個(gè)方面
1.1 硬件方面
1.2 服務(wù)器系統(tǒng)
1.3 數(shù)據(jù)庫存儲(chǔ)引擎的選擇
1.4 數(shù)據(jù)庫參數(shù)配置
1.5 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和SQL語句(重點(diǎn))
2 硬件方面
2.2.1 使用傳統(tǒng)機(jī)器硬盤
2.2.2 使用RAID增強(qiáng)傳統(tǒng)機(jī)器硬盤的性能
2.2.3 使用固態(tài)存儲(chǔ)SSD和PCIe卡
2.2.4 使用網(wǎng)絡(luò)存儲(chǔ)NAS和SAN
2.2.2.2.1 RAID 0
2.2.2.2.2 RAID 1
2.2.2.2.3 RAID 5 —— 常見的RAID組別
2.2.2.2.4 RAID 10 —— 常用的RAID組別
2.2.2.1 什么是RAID
2.2.2.2 RAID級(jí)別
2.2.2.3 RAID級(jí)別的選擇
2.2.4.1 網(wǎng)絡(luò)存儲(chǔ)使用的場(chǎng)景
2.2.4.2 網(wǎng)絡(luò)性能的限制
2.2.4.3 網(wǎng)絡(luò)對(duì)性能的影響
2.1.1 如何選擇CPU
2.1.2 內(nèi)存
2.1.2.1 常用MySQL存儲(chǔ)引擎
2.1.2.2 提示
2.1.2.3 如何選擇內(nèi)存
2.1 CPU資源和可用內(nèi)存大小
2.2 磁盤的配置和選擇
2.3 總結(jié)
3 操作系統(tǒng)對(duì)性能的影響
3.1 CentOS系統(tǒng)參數(shù)優(yōu)化
4 文件系統(tǒng)對(duì)性能的影響
5 MySQL體系結(jié)構(gòu)
1 影響性能的幾個(gè)方面
1.1 硬件方面
通常個(gè)人計(jì)算機(jī)速度慢,我們都會(huì)說是因?yàn)殡娔X硬件的問題,通常是CPU,內(nèi)存,磁盤IO等因素,因此在服務(wù)器上也會(huì)出現(xiàn)這個(gè)問題。
1.2 服務(wù)器系統(tǒng)
一般個(gè)人電腦的操作系統(tǒng)都是windows,不同版本的windows系統(tǒng)的性能都不相同,或者配置了某一些參數(shù)導(dǎo)致性能的不同。這對(duì)于服務(wù)器系統(tǒng)也是一樣,參數(shù)的設(shè)置也會(huì)影響服務(wù)器性能。
1.3 數(shù)據(jù)庫存儲(chǔ)引擎的選擇
MySQL具有插件式存儲(chǔ)引擎,可以根據(jù)不同的業(yè)務(wù)需求選擇不同的存儲(chǔ)引擎。
而不同的存儲(chǔ)引擎也有不同的特點(diǎn):
MyISAM:不支持事務(wù),表級(jí)鎖。
InnoDB:事務(wù)級(jí)存儲(chǔ)引擎,完美支持行級(jí)鎖,事務(wù)ACID特性。
1.4 數(shù)據(jù)庫參數(shù)配置
對(duì)于不同存儲(chǔ)引擎,它的參數(shù)配置都不盡相同,有些參數(shù)對(duì)存儲(chǔ)引擎的影響是微乎其微,但有些參數(shù)卻對(duì)性能起著決定性作用。因此我們會(huì)根據(jù)所選的存儲(chǔ)引擎和不同的業(yè)務(wù)需求,對(duì)參數(shù)的優(yōu)化也是很重要的。
1.5 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和SQL語句(重點(diǎn))
我們?cè)谶M(jìn)行數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)的時(shí)候應(yīng)該考慮到今后我們要在數(shù)據(jù)庫上執(zhí)行怎樣的sql語句,來對(duì)表結(jié)構(gòu)進(jìn)行查詢和更新,只有這樣才能設(shè)計(jì)出符合要求的表結(jié)構(gòu)。
對(duì)于慢查詢,是導(dǎo)致性能低下的罪魁禍?zhǔn)?,而它就是由于我們?duì)數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)不合理而產(chǎn)生的。而對(duì)于這類sql來說,也是最難優(yōu)化的,因?yàn)轫?xiàng)目一旦上線,就很難對(duì)數(shù)據(jù)庫表結(jié)構(gòu)進(jìn)行修改。
因此我們優(yōu)化數(shù)據(jù)庫性能的重點(diǎn)在于:
數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)
SQL語句的編寫和優(yōu)化
下面具體對(duì)每一個(gè)方面進(jìn)行詳細(xì)的說明。
2 硬件方面
2.1 CPU資源和可用內(nèi)存大小
2.1.1 如何選擇CPU
通常在選擇CPU的時(shí)候,我們都希望CPU的頻率和核心數(shù)量兩者都盡量高,但由于成本或各種因素,往往只能迫使我們選擇其中的一種。那我們應(yīng)該怎樣選擇最優(yōu)的方案?因此,在購買CPU時(shí)我們需要注意幾點(diǎn)問題:
我們的應(yīng)用時(shí)CPU密集型的嗎?
如果我們的應(yīng)用為CPU密集型的話,要加快sql的處理速度,顯然我們需要更好的CPU,而不是更多的CPU。
對(duì)于當(dāng)前的MySQL而言,還不支持duoCPU對(duì)同一SQL并發(fā)處理。
我們系統(tǒng)的并發(fā)量如何?
如果我們系統(tǒng)需要更多吞吐量,那么我們的CPU則是越多越好。假設(shè)我們有40個(gè)CPU,那我們是不是可以同時(shí)處理40個(gè)SQL了呢。
衡量數(shù)據(jù)庫處理能力的指標(biāo):QPS,指的是同時(shí)處理SQL的數(shù)量。但這個(gè)指標(biāo)是在1s中處理SQL的數(shù)量,但上一點(diǎn)闡述的同時(shí)處理是在納秒級(jí)的維度上。
MySQL通常是使用在web應(yīng)用上的,往往并發(fā)量比較大,這時(shí)CPU數(shù)量比CPU頻率更為重要。
我們所使用的MySQL的版本
在5.0版本之前,MySQL對(duì)多核的CPU支持是并不好,對(duì)系統(tǒng)的限制是很嚴(yán)重的,在現(xiàn)在5.6,5.7版本上,對(duì)多核CPU的支持已經(jīng)有了很大的改善。因此推薦使用新版的MySQL版本,以達(dá)到更好的性能。
選擇32位還是64位的CPU?
目前服務(wù)器的CPU默認(rèn)都是64位架構(gòu)的,但是要注意,要檢查好系統(tǒng)是否在64位上裝了32位的服務(wù)器版本,這會(huì)嚴(yán)重影響服務(wù)器性能。
2.1.2 內(nèi)存
內(nèi)存的大小直接影響數(shù)據(jù)庫的性能。目前內(nèi)存的效率要遠(yuǎn)遠(yuǎn)高于磁盤。因此把數(shù)據(jù)緩存到內(nèi)存中,可以大大提高服務(wù)器性能。
2.1.2.1 常用MySQL存儲(chǔ)引擎
有兩種常用的存儲(chǔ)引擎:MyISAM和InnoDB。
MyISAM:
索引存儲(chǔ)在內(nèi)存中,數(shù)據(jù)保存在硬盤中。
InnoDB:
索引和數(shù)據(jù)都保存在內(nèi)存中,從而提高數(shù)據(jù)庫的運(yùn)行效率。
雖然內(nèi)存的數(shù)量是越多越好,但是對(duì)系統(tǒng)的性能影響是有限的。
假如我們數(shù)據(jù)庫的數(shù)據(jù)有100G,那么內(nèi)存選擇在128G左右就可以達(dá)到較大的性能了,這時(shí)如果所有的數(shù)據(jù)都是熱數(shù)據(jù),那么都會(huì)緩存在內(nèi)存當(dāng)中,沒有必要上256G的內(nèi)存,但是選擇更大的內(nèi)存,對(duì)于操作系統(tǒng)等其他服務(wù)的性能也會(huì)有相應(yīng)的提高,并且在短期內(nèi)不用考慮升級(jí)內(nèi)存的問題。
對(duì)于內(nèi)存緩存的寫操作時(shí),可以進(jìn)行延緩寫入,減少數(shù)據(jù)庫的壓力。
內(nèi)存在讀操作上已經(jīng)有了很好的支持,在寫操作上也可以在內(nèi)存上完成,我們最后都需要將數(shù)據(jù)寫入到磁盤中,雖然不能避免寫入磁盤的操作,但是我們可以對(duì)寫入操作進(jìn)行延緩,將多次寫入合并成一次寫入,減輕數(shù)據(jù)庫的壓力。數(shù)據(jù)庫提供了類似的功能,可以在緩存池中將多次的寫操作合并成一次,最終寫入磁盤中。
2.1.2.3 如何選擇內(nèi)存
盡量使用主板能夠支持較大頻率的內(nèi)存
組成購買升級(jí),每個(gè)通道的內(nèi)存盡量相同品牌、顆粒、頻率、電壓、校驗(yàn)技術(shù)和型號(hào)。
根據(jù)數(shù)據(jù)庫大小選擇內(nèi)存。
2.2 磁盤的配置和選擇
雖然內(nèi)存對(duì)數(shù)據(jù)庫性能起到很大的作用,但是我們不能忽略IO子系統(tǒng)對(duì)性能的影響。目前我們常用的磁盤選擇有以下4種:
2.2.1 使用傳統(tǒng)機(jī)器硬盤
特點(diǎn):存儲(chǔ)空間大,價(jià)格低,使用最多,最常見,讀、寫較慢
如何選擇傳統(tǒng)機(jī)器硬盤?
存儲(chǔ)容量
傳輸速度
訪問時(shí)間
主軸轉(zhuǎn)速
物理尺寸
2.2.2 使用RAID增強(qiáng)傳統(tǒng)機(jī)器硬盤的性能
2.2.2.1 什么是RAID
RAID是磁盤冗余隊(duì)列的簡稱(Redundant Arrays of Independent Disks),簡單來說RAID的作用就是把多個(gè)容量較小的磁盤組成一組容量更大的磁盤,并提供數(shù)據(jù)冗余來保證數(shù)據(jù)完整性的技術(shù)。
2.2.2.2 RAID級(jí)別
2.2.2.2.1 RAID 0
RAID 0 是最早出現(xiàn)的RAID模式,也稱之為數(shù)據(jù)條帶。是組件磁盤陣列中最簡單的一種形式,只需要2塊以上的硬盤即可,成本低,可以提高整個(gè)磁盤的性能和吞吐量。RAID 0沒有提供冗余或錯(cuò)誤修復(fù)能力,但是實(shí)現(xiàn)成本是最低的。但在考慮到數(shù)據(jù)恢復(fù)和可靠性因素,RAID 0成為了成本高的配置,因?yàn)镽AID 0中沒有冗余,并且數(shù)據(jù)在損壞的概率在當(dāng)個(gè)磁盤中的還要高。因?yàn)閿?shù)據(jù)在任意一個(gè)磁盤中損壞都會(huì)造成數(shù)據(jù)的丟失。比如由3塊磁盤組成的RAID 0,其損壞的幾率是單個(gè)硬盤的3倍。
因此RAID 0適用于不會(huì)單一丟失數(shù)據(jù)的情況,比如:可以隨時(shí)可以從其他數(shù)據(jù)庫克隆的備庫或者某些只需一次性使用的數(shù)據(jù)庫。
簡單來說,RAID 0就是將硬盤串聯(lián)在一起,形成更大的磁盤,比如:
并且在并發(fā)的過程中,可以達(dá)到相當(dāng)于單個(gè)硬盤3倍的性能。
RAID 1 又稱磁盤鏡像,原理是把一個(gè)磁盤的數(shù)據(jù)鏡像到另一個(gè)磁盤上,也就是說數(shù)據(jù)在寫入一塊磁盤的同時(shí),會(huì)在另一塊限制的磁盤上生成鏡像文件,在不影響性能情況下較大限度的保證系統(tǒng)的可靠性和可修復(fù)性。
它與RAID 0不同的地方在,中間的地方畫上了一個(gè)等于號(hào)。兩個(gè)磁盤的數(shù)據(jù)都是一樣的,具備良好的冗余能力,但成本會(huì)相應(yīng)的提高,當(dāng)出現(xiàn)磁盤故障的情況下也可以正常運(yùn)行,但需要即使更換故障的磁盤,否則系統(tǒng)也會(huì)崩潰。
在更換新的磁盤后,數(shù)據(jù)的同步需要消耗很多時(shí)間,雖然不會(huì)對(duì)數(shù)據(jù)的訪問造成影響,但系統(tǒng)的性能是會(huì)有所下降的。
RAID 1在很多情況下,可以提供很好的讀性能,并且在不同磁盤間冗余數(shù)據(jù),因此數(shù)據(jù)冗余性很好。RAID 1在讀上比RAID 0 要好,因此比較適合在存放日志或類似的工作。
RAID 5 又稱之為分布式奇偶校驗(yàn)磁盤陣列。通過分布式奇偶校驗(yàn)塊把數(shù)據(jù)分散到多個(gè)磁盤上,這樣如果任何一個(gè)盤數(shù)據(jù)失效,都可以從奇偶校驗(yàn)塊中重建。但是如果兩塊磁盤失效,則整個(gè)卷的數(shù)據(jù)都無法恢復(fù)。
可見,每個(gè)磁盤中分別有Dp,Cp,Bp,Ap,如果其中一塊磁盤出現(xiàn)問題,則可以通過其他三塊磁盤的數(shù)據(jù)和奇偶校驗(yàn)值重新計(jì)算出磁盤的數(shù)據(jù)。
對(duì)于RAID 0和RAID 1而言,這是最經(jīng)濟(jì)的冗余配置,因?yàn)檎麄€(gè)陣列配置只需要1塊磁盤的容量就可以了。
在RAID 5上寫速度較慢,因?yàn)槊看螌懚家诖疟P之間進(jìn)行2次讀和2次寫,以計(jì)算存儲(chǔ)校驗(yàn)位的數(shù)值,但是,隨機(jī)讀和順序讀都很快,因?yàn)樵谧x取的時(shí)候不需要計(jì)算奇偶校驗(yàn)位,因此RAID 5 更適合以讀為主的數(shù)據(jù)庫業(yè)務(wù)。
RAID 5發(fā)生的較大問題是在磁盤失效的時(shí)候,因?yàn)閿?shù)據(jù)需要重新分配到其他磁盤上,這將會(huì)嚴(yán)重影響磁盤的性能,所以使用RAID 5好使用在重讀的情況下。
RAID 10又稱分片的鏡像。它是對(duì)磁盤先做RAID 1之后對(duì)兩組RAID 1的磁盤再做RAID 0,所以對(duì)讀寫都有良好的性能,相對(duì)于RAID 5重建起來更簡單,速度也更快。
在RAID 10上,如果損壞了一個(gè)硬盤,那么對(duì)性能會(huì)造成嚴(yán)重的影響,因?yàn)樵谧x寫過程中,本來可以在兩塊相鄰的磁盤中同時(shí)讀取,如果損壞了一塊,那么只能從單臺(tái)磁盤進(jìn)行讀取,因此最壞的情況下,我們的性能會(huì)降低50%。
等級(jí) | 特點(diǎn) | 是否冗余 | 盤數(shù) | 讀 | 寫 |
---|---|---|---|---|---|
RAID 0 | 便宜,快速,危險(xiǎn) | 否 | N | 快 | 快 |
RAID 1 | 高速讀,簡單,安全 | 有 | 2 | 快 | 慢 |
RAID 5 | 安全,成本折中 | 有 | N+1 | 快 | 取決于最慢的盤 |
RAID 10 | 貴,高速,安全 | 有 | 2N | 快 | 快 |
2.2.3 使用固態(tài)存儲(chǔ)SSD和PCIe卡
固態(tài)存儲(chǔ)又稱為閃存。
特點(diǎn):
相比機(jī)械磁盤固態(tài)磁盤有更好的隨機(jī)讀寫性能
相比機(jī)械磁盤固態(tài)磁盤有更好的支持并發(fā)
相比機(jī)械磁盤固態(tài)磁盤更容易損壞
SSD特點(diǎn):
使用SATA接口,可以替換傳統(tǒng)磁盤而不需任何改變
SATA接口的SSD同樣支持RAID技術(shù)
固態(tài)存儲(chǔ)PCIe卡特點(diǎn):
無法使用SATA接口,需要獨(dú)特的驅(qū)動(dòng)和配置
價(jià)格相對(duì)于SSD更貴,但是性能比SSD更好
固態(tài)存儲(chǔ)的使用場(chǎng)景
適用于存在大量隨機(jī)I/O的場(chǎng)景
使用解決單線程負(fù)載的I/O瓶頸
2.2.4 使用網(wǎng)絡(luò)存儲(chǔ)NAS和SAN
SAN(Strorage Area Network) 和 NAS(Network-Attached Storage) 是兩種外部文件存儲(chǔ)設(shè)備加載到服務(wù)器上的方法。
SAN:
SAN設(shè)備通過光纖連接到服務(wù)器,設(shè)備通過塊接口訪問,服務(wù)器可以將其當(dāng)作硬盤使用。
SAN的特點(diǎn):
NAS:
NAS設(shè)備使用網(wǎng)絡(luò)連接,通過基于文件的協(xié)議如NFS或SMB來訪問。
2.2.4.1 網(wǎng)絡(luò)存儲(chǔ)使用的場(chǎng)景
適合使用在數(shù)據(jù)庫備份。
2.2.4.2 網(wǎng)絡(luò)性能的限制
網(wǎng)絡(luò)性能的限制主要是延遲和帶寬。
2.2.4.3 網(wǎng)絡(luò)對(duì)性能的影響
網(wǎng)絡(luò)帶寬對(duì)性能的影響
網(wǎng)絡(luò)質(zhì)量對(duì)性能的影響
建議:
采用高性能和高帶寬的網(wǎng)絡(luò)接口設(shè)備和交換機(jī)
對(duì)多個(gè)網(wǎng)卡進(jìn)行綁定,增強(qiáng)可用性和帶寬
盡可能的進(jìn)行網(wǎng)絡(luò)隔離
2.3 總結(jié)
CPU:
64位的CPU一定要工作在64位的系統(tǒng)下
對(duì)于并發(fā)比較高的場(chǎng)景CPU的數(shù)量比頻率重要
對(duì)于CPu密集型場(chǎng)景和復(fù)雜SQL則頻率越高越好
內(nèi)存:
選擇主板所能使用的高頻率的內(nèi)存
內(nèi)存的大小對(duì)性能很重要,所以盡可能的大
I/O子系統(tǒng):
PCIe -> SSD -> RAID10 -> 磁盤 -> SAN
3 操作系統(tǒng)對(duì)性能的影響
MySQL適合的操作系統(tǒng):Windows,F(xiàn)reeBSD,Solaris,Linux
3.1 CentOS系統(tǒng)參數(shù)優(yōu)化
內(nèi)核相關(guān)參數(shù)(/etc/sysctl.conf)
net.core.somaxconn = 65535
對(duì)于處于一個(gè)監(jiān)聽狀態(tài)的端口,都有一個(gè)自己的監(jiān)聽隊(duì)列,這個(gè)參數(shù)決定了每個(gè)端口的監(jiān)聽隊(duì)列的較大長度。這個(gè)參數(shù)的默認(rèn)值可能會(huì)比較小,對(duì)于很大的服務(wù)器來說是不夠的,一般會(huì)修改成2048或更大的值。
net.core.netdev_max_backlog=65535
net.ipv4.tcp_max_syn_backlog=65535
其中backlog這個(gè)參數(shù)決定了在每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理機(jī)處理快的時(shí)候,允許被發(fā)送到隊(duì)列中的數(shù)據(jù)包的較大的數(shù)目,而另一個(gè)參數(shù)了是決定了這些還未獲得對(duì)方連接的這種請(qǐng)求可保存在隊(duì)中的較大數(shù)目。對(duì)于超過這個(gè)值大小的連接可能會(huì)被拋棄,所以要同時(shí)調(diào)大一些。
net.ipv4.tcp_fin_timeout = 10
這個(gè)參數(shù)是用于控制tcp連接處理的等待狀態(tài)的超時(shí)時(shí)間。對(duì)于連接比較頻繁的系統(tǒng),通常由大量的連接數(shù)處于等待狀態(tài),這個(gè)參數(shù)的設(shè)置就是減少連接超時(shí)的時(shí)間,加快tcp的回收速度。同樣有對(duì)tcp連接有影響的參數(shù)有以下兩個(gè):net.ipv4.tcp_tw_reuse = 1
、net.ipv4.tcp_tw_recycle = 1
這三個(gè)參數(shù)都是主要加快tcp的回收,在高負(fù)載的系統(tǒng)下,如果tcp連接被占滿的話,就會(huì)出現(xiàn)連接數(shù)據(jù)庫500的錯(cuò)誤,因此這三個(gè)參數(shù)的作用是很大的。
net.core.wmem_default = 87380
、net.core.wmem_max = 16777216
、net.core.r0mem_default = 87380
、net.core.rmem_max = 16777216
以上4個(gè)參數(shù)決定了tcp連接接收和發(fā)送緩沖區(qū)大小的默認(rèn)值和較大值。對(duì)于數(shù)據(jù)庫來說,應(yīng)該把這幾個(gè)參數(shù)的值調(diào)整的稍微大一些。
net.ipv4.tcp_keepalive_time = 120
、net.ipv4.tcp_keepalive_intvl = 30
、net.ipv4.tcp_keepalive_probes = 3
以上三個(gè)參數(shù)用于減少失效連接所占用的tcp系統(tǒng)資源的數(shù)量,加快資源回收的效率,net.ipv4.tcp_keepalive_time
是表示tcp發(fā)送tcp_keepalive探測(cè)消息的時(shí)間的間隔,單位為秒, 用于確認(rèn)tcp連接是否有效。net.ipv4.tcp_keepalive_intvl
用于當(dāng)探測(cè)這個(gè)tcp連接沒有反應(yīng)后,重新發(fā)送探測(cè)消息的時(shí)間間隔,單位為秒,net.ipv4.tcp_keepalive_probes
表示在認(rèn)定tcp連接失效之前,需要發(fā)送多少個(gè)tcp_keepalive探測(cè)消息。這三個(gè)參數(shù)的默認(rèn)值對(duì)于一個(gè)平常系統(tǒng)來說稍微有點(diǎn)大了,所以這里分別對(duì)它們改為了小了一些。
kernel.shmmax = 4294967295
這個(gè)參數(shù)是Linux內(nèi)核參數(shù)中最重要的參數(shù)之一,用于定義單個(gè)共享內(nèi)存段的較大值。
注意:
這個(gè)參數(shù)應(yīng)該設(shè)置的足夠大,以便能在一個(gè)共享內(nèi)存段下容納下整個(gè)的Innodb緩沖池的大小。
這個(gè)值的大小對(duì)于64為Linux系統(tǒng),可取的較大值為物理內(nèi)存值 - 1 byte,建議值為大于物理內(nèi)存段的一半,一般取直大于Innodb緩沖池的大小即可,可以取物理內(nèi)存 - 1 byte。
vm.swappiness = 0
這個(gè)參數(shù)當(dāng)內(nèi)存不足時(shí)會(huì)對(duì)性能產(chǎn)生比較明顯的影響。這個(gè)參數(shù)就是告訴Linux系統(tǒng)內(nèi)核除非虛擬內(nèi)存完全滿了,否則不要使用交換區(qū)。
Linux系統(tǒng)內(nèi)存交換分區(qū):
在Linux系統(tǒng)安裝時(shí)都會(huì)有一個(gè)特殊的磁盤分區(qū),稱之為系統(tǒng)交換分區(qū)。如果我們使用free -m
在系統(tǒng)中查看可以看到類似下面的內(nèi)容,其中swap就是交換分區(qū)。當(dāng)操作系統(tǒng)因?yàn)闆]有足夠的內(nèi)存時(shí)就會(huì)將一些虛擬內(nèi)存寫到磁盤的交換區(qū)中這樣就會(huì)發(fā)生內(nèi)存交換。
在MySQL服務(wù)所在的Linux系統(tǒng)上完全禁用交換分區(qū),會(huì)帶來以下兩點(diǎn)風(fēng)險(xiǎn):
降低操作系統(tǒng)的性能
容易造成內(nèi)存溢出,崩潰,或都被操作系統(tǒng)Kill掉
增加資源限制(/etc/security/limit.conf)limit.conf
這個(gè)文件實(shí)際上時(shí)Linx PAM也就是插入式認(rèn)證模塊的配置文件。
其中比較重要的參數(shù)配置就是打開文件數(shù)的限制。
結(jié)論:把可打開的文件數(shù)量增加到了65535個(gè)以保證可以打開足夠多的文件句柄。
注意:這個(gè)文件的修改需要重啟服務(wù)器后生效。
磁盤調(diào)度策略(/sys/block/devname/queue/scheduler)
可以使用命令cat /sys/block/sda/queue/scheduler
查看當(dāng)前磁盤所使用的調(diào)度策略。下面的noop anticipatory deadline [cfq]
為系統(tǒng)默認(rèn)的cfq調(diào)度策略。
在MySQL數(shù)據(jù)庫服務(wù)下,cfq并不合適,是由于在MySQL工作過程中,cfq會(huì)在隊(duì)列中插入一些不必要的請(qǐng)求,導(dǎo)致很差的響應(yīng)時(shí)間。
除了cfq調(diào)度策略,還有以下幾種策略:
noop(電梯式調(diào)度策略):
deadline(截止時(shí)間調(diào)度策略):
anticipatory(預(yù)料I/O調(diào)度策略):
我們可以輸入以下命令來改變磁盤的調(diào)度策略:echo schedulerName > /sys/block/sda/queue/scheduler
如:echo deadline > /sys/block/sda/queue/scheduler
4 文件系統(tǒng)對(duì)性能的影響
推薦使用XFS文件系統(tǒng),在EXT3和EXT4下需要配置以下參數(shù):
EXT3/4系統(tǒng)的掛載參數(shù)(/etc/fstab):
data=writeback | ordered | journal
這個(gè)參數(shù)一共有三個(gè)可選擇的值,writeback
表示只有元數(shù)據(jù)寫入到日志,元數(shù)據(jù)寫入和數(shù)據(jù)寫入并不是同步的。這是一種最快的配置,因?yàn)镮nnoDB原本有自己的事務(wù)日志,所以通常是InnoDB好的選擇。ordered
只會(huì)記錄元數(shù)據(jù),但提供了一些一致性的保證,在寫元數(shù)據(jù)之前,會(huì)先寫數(shù)據(jù),使它們保持一致,這個(gè)選項(xiàng)比writeback
稍微慢一點(diǎn),但出現(xiàn)崩潰會(huì)更加安全。journal
提供了原子日志的行為,在數(shù)據(jù)寫入到最終的日志之前,將記錄到日志中。這個(gè)選項(xiàng)對(duì)于InnoDB顯然是沒有必要的,也是三種中最慢的一種。
noatime
、nodiratime
這兩個(gè)選項(xiàng)用于記錄文件的訪問時(shí)間和讀取目錄的時(shí)間。設(shè)置了這兩個(gè)參數(shù)可以減少一些寫的操作。系統(tǒng)在讀取文件和目錄時(shí)也不必寫操作來記錄以上兩個(gè)時(shí)間。
下面是文件/dev/sda1/ext4
中的一些配置:noatime,nodiratime,data=writeback 1 1
5 MySQL體系結(jié)構(gòu)
體系結(jié)構(gòu)在最上層的叫做客戶端,這一層代表了可以通過mysql連接協(xié)議連接到mysql的客戶端,比如說PHP,JAVA,C API,.Net以及ODBC,JDBC等,從這里可以看出,這一層并不是mysql體系結(jié)構(gòu)所特有。大多數(shù)CS架構(gòu)的服務(wù)都是采用了這一種體系結(jié)構(gòu)。這一層主要是完成了連接處理,授權(quán)認(rèn)證和安全等一些功能。每個(gè)連接到mysql的客戶端都在服務(wù)器的進(jìn)程中擁有一個(gè)線程,這個(gè)連接的查詢只會(huì)在這個(gè)線程中進(jìn)行執(zhí)行,也就是我們前面說到的,每個(gè)連接的查詢只用到一個(gè)CPU的核心。
那么這個(gè)體系的第二層,大多數(shù)的mysql核心服務(wù)都在這一層中,如下圖所示。
我們常用的DDL或者DML語句都是在這一層上定義的。但是我們只要記住一點(diǎn)就可以了,所有跨存儲(chǔ)引擎的功能都是在這一層中實(shí)現(xiàn)的,因?yàn)檫@一層也被稱之為服務(wù)層。
我們的結(jié)構(gòu)體系的第三層是存儲(chǔ)引擎層,mysql是一款非常優(yōu)秀的開源數(shù)據(jù)庫,其中定義了一系列了存儲(chǔ)引擎的接口,只要符合存儲(chǔ)引擎的要求,我們就可以對(duì)mysql開發(fā)出一款完全符合自己需要的存儲(chǔ)引擎,比如我們常用的InnoDB,目前mysql支持的存儲(chǔ)引擎有很多,如下圖所示:
注意:存儲(chǔ)引擎是針對(duì)于表的而不是針對(duì)于庫的(一個(gè)庫中的不同表可以使用不同的存儲(chǔ)引擎)
以上是“MYSQL進(jìn)階怎么學(xué)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!