本篇內(nèi)容主要講解“MySQL數(shù)據(jù)庫(kù)的性能分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MySQL數(shù)據(jù)庫(kù)的性能分析”吧!

東陽(yáng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
1. MySQL性能優(yōu)化簡(jiǎn)介
在Web應(yīng)用程序體系架構(gòu)中,數(shù)據(jù)持久層(通常是一個(gè)關(guān)系數(shù)據(jù)庫(kù))是關(guān)鍵的核心部分,它對(duì)系統(tǒng)的性能有非常重要的影響。MySQL是目前使用最 多的開源數(shù)據(jù)庫(kù),但是MySQL數(shù)據(jù)庫(kù)的默認(rèn)設(shè)置性能非常的差,僅僅是一個(gè)玩具數(shù)據(jù)庫(kù)。因此在產(chǎn)品中使用MySQL數(shù)據(jù)庫(kù)必須進(jìn)行必要的優(yōu)化。
優(yōu)化是一個(gè)復(fù)雜的任務(wù),本文描述MySQL相關(guān)的數(shù)據(jù)庫(kù)設(shè)計(jì)和查詢優(yōu)化,服務(wù)器端優(yōu)化,存儲(chǔ)引擎優(yōu)化。
2. 數(shù)據(jù)庫(kù)設(shè)計(jì)和查詢優(yōu)化
在MySQL性能優(yōu)化中,首先要考慮的就是Database Schema設(shè)計(jì),這一點(diǎn)是非常重要的。一個(gè)糟糕的Schema設(shè)計(jì)即使在性能調(diào)優(yōu)的MySQL Server上運(yùn)行,也會(huì)表現(xiàn)出很差的性能;和Schema相似,查詢語句的設(shè)計(jì)也會(huì)影響MySQL的性能,應(yīng)該避免寫出低效的SQL查詢。這一節(jié)將詳細(xì) 討論這兩方面的優(yōu)化。
2.1 Schema Design
Schema的優(yōu)化取決于將要運(yùn)行什么樣的query,不同的query會(huì)有不同的Schema優(yōu)化方案。2.2節(jié)將介紹Query Design的優(yōu)化。Schema設(shè)計(jì)同樣受到預(yù)期數(shù)據(jù)集大小的影響。Schema設(shè)計(jì)時(shí)主要考慮:標(biāo)準(zhǔn)化,數(shù)據(jù)類型,索引。
2.1.1 標(biāo)準(zhǔn)化
標(biāo)準(zhǔn)化是在數(shù)據(jù)庫(kù)中組織數(shù)據(jù)的過程。其中包括,根據(jù)設(shè)計(jì)規(guī)則創(chuàng)建表并在這些表間建立關(guān)系;通過取消冗余度與不一致相關(guān)性,該設(shè)計(jì)規(guī)則可以同時(shí)保 護(hù)數(shù)據(jù)并提高數(shù)據(jù)的靈活性。通常數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)化是讓數(shù)據(jù)庫(kù)設(shè)計(jì)符合某一級(jí)別的范式,通常滿足第三范式即可。也有第四范式(也稱為 Boyce Codd范式,BCNF))與第五范式存在,但是在實(shí)際設(shè)計(jì)中很少考慮。忽視這些規(guī)則可能使得數(shù)據(jù)庫(kù)的設(shè)計(jì)不太完美,但這不應(yīng)影響功能。
標(biāo)準(zhǔn)化的特點(diǎn):
1) 所有的"對(duì)象"都在它自己的table中,沒有冗余。
2) 數(shù)據(jù)庫(kù)通常由E-R圖生成。
3) 簡(jiǎn)潔,更新屬性通常只需要更新很少的記錄。
4) Join操作比較耗時(shí)。
5) Select,sort優(yōu)化措施比較少。
6) 適用于OLTP應(yīng)用。
非標(biāo)準(zhǔn)化的特點(diǎn):
1) 在一張表中存儲(chǔ)很多數(shù)據(jù),數(shù)據(jù)冗余。
2) 更新數(shù)據(jù)開銷很大,更新一個(gè)屬性可能會(huì)更新很多表,很多記錄。
3) 在刪除數(shù)據(jù)是有可能丟失數(shù)據(jù)。
4) Select,order有很多優(yōu)化的選擇。
5) 適用于DSS應(yīng)用。
標(biāo)準(zhǔn)化和非標(biāo)準(zhǔn)化都有各自的優(yōu)缺點(diǎn),通常在一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)中可以混合使用,一部分表格標(biāo)準(zhǔn)化,一部分表格保留一些冗余數(shù)據(jù):
1) 對(duì)OLTP使用標(biāo)準(zhǔn)化,對(duì)DSS使用非標(biāo)準(zhǔn)化
2) 使用物化視圖。MySQL不直接支持該數(shù)據(jù)庫(kù)特性,但是可以用MyISAM表代替。
3) 冗余一些數(shù)據(jù)在表格中,例如將ref_id和name存在同一張表中。但是要注意更新問題。
4) 對(duì)于一些簡(jiǎn)單的對(duì)象,直接使用value作為建。例如IP address等
5) Reference by PRIMARY/UNIQUE KEY.MySQL可以優(yōu)化這種操作,例如:
java 代碼
select city_name from city,state where state_id=state.id and state.code='CA'" converted to "select city_name from city where state_id=12
2.1.2 數(shù)據(jù)類型
最基本的優(yōu)化之一就是使表在磁盤上占據(jù)的空間盡可能小。這能帶來性能非常大的提升,因?yàn)閿?shù)據(jù)小,磁盤讀入較快,并且在查詢過程中表內(nèi)容被處理所占用的內(nèi)存更少。同時(shí),在更小的列上建索引,索引也會(huì)占用更少的資源。
可以使用下面的技術(shù)可以使表的性能更好并且使存儲(chǔ)空間最小:
1) 使用正確合適的類型,不要將數(shù)字存儲(chǔ)為字符串。
2) 盡可能地使用最有效(最小)的數(shù)據(jù)類型。MySQL有很多節(jié)省磁盤空間和內(nèi)存的專業(yè)化類型。
3) 盡可能使用較小的整數(shù)類型使表更小。例如,MEDIUMINT經(jīng)常比INT好一些,因?yàn)镸EDIUMINT列使用的空間要少25%.
4) 如果可能,聲明列為NOT NULL.它使任何事情更快而且每列可以節(jié)省一位。注意如果在應(yīng)用程序中確實(shí)需要NULL,應(yīng)該毫無疑問使用它,只是避免 默認(rèn)地在所有列上有它。
5) 對(duì)于MyISAM表,如果沒有任何變長(zhǎng)列(VARCHAR、TEXT或BLOB列),使用固定尺寸的記錄格式。這比較快但是不幸地可能會(huì)浪費(fèi)一些空間。即 使你已經(jīng)用CREATE選項(xiàng)讓VARCHAR列ROW_FORMAT=fixed,也可以提示想使用固定長(zhǎng)度的行。
6) 使用sample character set,例如latin1.盡量少使用utf-8,因?yàn)閡tf-8占用的空間是latin1的3倍。可以在不需要使用utf-8的字段上面使用 latin1,例如mail,url等。
2.1.3 索引
所有MySQL列類型可以被索引。對(duì)相關(guān)列使用索引是提高SELECT操作性能的最佳途徑。使用索引應(yīng)該注意以下幾點(diǎn):
1) MySQL只會(huì)使用前綴,例如key(a, b) …where b=5 將使用不到索引。
2) 要選擇性的使用索引。在變化很少的列上使用索引并不是很好,例如性別列。
3) 在Unique列上定義Unique index.
4) 避免建立使用不到的索引。
5) 在Btree index中(InnoDB使用Btree),可以在需要排序的列上建立索引。
6) 避免重復(fù)的索引。
7) 避免在已有索引的前綴上建立索引。例如:如果存在index(a,b)則去掉index(a)。
8) 控制單個(gè)索引的長(zhǎng)度。使用key(name(8))在數(shù)據(jù)的前面幾個(gè)字符建立索引。
9) 越是短的鍵值越好,最好使用integer.
10) 在查詢中要使用到索引(使用explain查看),可以減少讀磁盤的次數(shù),加速讀取數(shù)據(jù)。
11) 相近的鍵值比隨機(jī)好。Auto_increment就比uuid好。
12) Optimize table可以壓縮和排序index,注意不要頻繁運(yùn)行。
13) Analyze table可以更新數(shù)據(jù)。
2.2 Designing queries
查詢語句的優(yōu)化是一個(gè)Case by case的問題,不同的sql有不同的優(yōu)化方案,在這里我只列出一些通用的技巧。
1) 在有index的情況下,盡量保證查詢使用了正確的index.可以使用EXPLAIN select …查看結(jié)果,分析查詢。
2) 查詢時(shí)使用匹配的類型。例如select * from a where id=5, 如果這里id是字符類型,同時(shí)有index,這條查詢則使用不到index,會(huì)做全表掃描,速度會(huì)很慢。正確的應(yīng)該是 … where id="5" ,加上引號(hào)表明類型是字符。
3) 使用--log-slow-queries –long-query-time=2查看查詢比較慢的語句。然后使用explain分析查詢,做出優(yōu)化。
3. 服務(wù)器端優(yōu)化
3.1 MySQL安裝
MySQL有很多發(fā)行版本,最好使用MySQL AB發(fā)布的二進(jìn)制版本。也可以下載源代碼進(jìn)行編譯安裝,但是編譯器和類庫(kù)的一些bug可能會(huì)使編譯完成的MySQL存在潛在的問題。
到此,相信大家對(duì)“MySQL數(shù)據(jù)庫(kù)的性能分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
名稱欄目:MySQL數(shù)據(jù)庫(kù)的性能分析
文章位置:http://chinadenli.net/article18/ipccgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、小程序開發(fā)、網(wǎng)站建設(shè)、域名注冊(cè)、網(wǎng)站制作、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)