怎么提高mysql性能 mysql性能提升

如何提高M(jìn)ySQL Limit查詢的性能?

如何提高M(jìn)ySQL Limit查詢的性能?\x0d\x0a在MySQL數(shù)據(jù)庫操作中,我們?cè)谧鲆恍┎樵兊臅r(shí)候總希望能避免數(shù)據(jù)庫引擎做全表掃描,因?yàn)槿頀呙钑r(shí)間長(zhǎng),而且其中大部分掃描對(duì)客戶端而言是沒有意義的。其實(shí)我們可以使用Limit關(guān)鍵字來避免全表掃描的情況,從而提高效率。\x0d\x0a有個(gè)幾千萬條記錄的表 on MySQL 5.0.x,現(xiàn)在要讀出其中幾十萬萬條左右的記錄。常用方法,依次循環(huán): \x0d\x0aselect * from mytable where index_col = xxx limit offset, limit; \x0d\x0a\x0d\x0a經(jīng)驗(yàn):如果沒有blob/text字段,單行記錄比較小,可以把 limit 設(shè)大點(diǎn),會(huì)加快速度。\x0d\x0a問題:頭幾萬條讀取很快,但是速度呈線性下降,同時(shí) mysql server cpu 99% ,速度不可接受。 \x0d\x0a調(diào)用 explain select * from mytable where index_col = xxx limit offset, limit; \x0d\x0a顯示 type = ALL \x0d\x0a在 MySQL optimization 的文檔寫到"All"的解釋 \x0d\x0aA full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables. \x0d\x0a看樣子對(duì)于 all, mysql 就使用比較笨的方法,那就改用 range 方式? 因?yàn)?id 是遞增的,也很好修改 sql 。\x0d\x0aselect * from mytable where id offset and id SELECT * FROM table LIMIT 5,10; //檢索記錄行6-15\x0d\x0a\x0d\x0a//為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為-1\x0d\x0amysql SELECT * FROM table LIMIT 95,-1; //檢索記錄行96-last\x0d\x0a\x0d\x0a//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目,換句話說,LIMIT n 等價(jià)于 LIMIT 0,n\x0d\x0amysql SELECT * FROM table LIMIT 5; //檢索前5個(gè)記錄行\(zhòng)x0d\x0a\x0d\x0aMySQL的limit給分頁帶來了極大的方便,但數(shù)據(jù)量一大的時(shí)候,limit的性能就急劇下降。同樣是取10條數(shù)據(jù),下面兩句就不是一個(gè)數(shù)量級(jí)別的。\x0d\x0aselect * from table limit 10000,10\x0d\x0aselect * from table limit 0,10\x0d\x0a\x0d\x0a文中不是直接使用limit,而是首先獲取到offset的id然后直接使用limit size來獲取數(shù)據(jù)。根據(jù)他的數(shù)據(jù),明顯要好于直接使用limit。\x0d\x0a這里我具體使用數(shù)據(jù)分兩種情況進(jìn)行測(cè)試。\x0d\x0a1、offset比較小的時(shí)候:\x0d\x0aselect * from table limit 10,10 \x0d\x0a//多次運(yùn)行,時(shí)間保持在0.0004-0.0005之間\x0d\x0aSelect * From table Where vid >=(Select vid From table Order By vid limit 10,1) limit 10 \x0d\x0a//多次運(yùn)行,時(shí)間保持在0.0005-0.0006之間,主要是0.0006\x0d\x0a\x0d\x0a結(jié)論:偏移offset較小的時(shí)候,直接使用limit較優(yōu)。這個(gè)顯然是子查詢的原因。\x0d\x0a2、offset大的時(shí)候:\x0d\x0aselect * from table limit 10000,10 \x0d\x0a//多次運(yùn)行,時(shí)間保持在0.0187左右\x0d\x0a\x0d\x0aSelect * From table Where vid >=(Select vid From table Order By vid limit 10000,1) limit 10\x0d\x0a//多次運(yùn)行,時(shí)間保持在0.0061左右,只有前者的1/3??梢灶A(yù)計(jì)offset越大,后者越優(yōu)。

發(fā)展壯大離不開廣大客戶長(zhǎng)期以來的信賴與支持,我們將始終秉承“誠(chéng)信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠(chéng)服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及成都效果圖設(shè)計(jì)等,在重慶網(wǎng)站建設(shè)全網(wǎng)整合營(yíng)銷推廣、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。

超詳細(xì)MySQL數(shù)據(jù)庫優(yōu)化

數(shù)據(jù)庫優(yōu)化一方面是找出系統(tǒng)的瓶頸,提高M(jìn)ySQL數(shù)據(jù)庫的整體性能,而另一方面需要合理的結(jié)構(gòu)設(shè)計(jì)和參數(shù)調(diào)整,以提高用戶的相應(yīng)速度,同時(shí)還要盡可能的節(jié)約系統(tǒng)資源,以便讓系統(tǒng)提供更大的負(fù)荷.

1. 優(yōu)化一覽圖

2. 優(yōu)化

筆者將優(yōu)化分為了兩大類,軟優(yōu)化和硬優(yōu)化,軟優(yōu)化一般是操作數(shù)據(jù)庫即可,而硬優(yōu)化則是操作服務(wù)器硬件及參數(shù)設(shè)置.

2.1 軟優(yōu)化

2.1.1 查詢語句優(yōu)化

1.首先我們可以用EXPLAIN或DESCRIBE(簡(jiǎn)寫:DESC)命令分析一條查詢語句的執(zhí)行信息.

2.例:

顯示:

其中會(huì)顯示索引和查詢數(shù)據(jù)讀取數(shù)據(jù)條數(shù)等信息.

2.1.2 優(yōu)化子查詢

在MySQL中,盡量使用JOIN來代替子查詢.因?yàn)樽硬樵冃枰短撞樵?嵌套查詢時(shí)會(huì)建立一張臨時(shí)表,臨時(shí)表的建立和刪除都會(huì)有較大的系統(tǒng)開銷,而連接查詢不會(huì)創(chuàng)建臨時(shí)表,因此效率比嵌套子查詢高.

2.1.3 使用索引

索引是提高數(shù)據(jù)庫查詢速度最重要的方法之一,關(guān)于索引可以參高筆者M(jìn)ySQL數(shù)據(jù)庫索引一文,介紹比較詳細(xì),此處記錄使用索引的三大注意事項(xiàng):

2.1.4 分解表

對(duì)于字段較多的表,如果某些字段使用頻率較低,此時(shí)應(yīng)當(dāng),將其分離出來從而形成新的表,

2.1.5 中間表

對(duì)于將大量連接查詢的表可以創(chuàng)建中間表,從而減少在查詢時(shí)造成的連接耗時(shí).

2.1.6 增加冗余字段

類似于創(chuàng)建中間表,增加冗余也是為了減少連接查詢.

2.1.7 分析表,,檢查表,優(yōu)化表

分析表主要是分析表中關(guān)鍵字的分布,檢查表主要是檢查表中是否存在錯(cuò)誤,優(yōu)化表主要是消除刪除或更新造成的表空間浪費(fèi).

1. 分析表: 使用 ANALYZE 關(guān)鍵字,如ANALYZE TABLE user;

2. 檢查表: 使用 CHECK關(guān)鍵字,如CHECK TABLE user [option]

option 只對(duì)MyISAM有效,共五個(gè)參數(shù)值:

3. 優(yōu)化表:使用OPTIMIZE關(guān)鍵字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不寫入日志.,優(yōu)化表只對(duì)VARCHAR,BLOB和TEXT有效,通過OPTIMIZE TABLE語句可以消除文件碎片,在執(zhí)行過程中會(huì)加上只讀鎖.

2.2 硬優(yōu)化

2.2.1 硬件三件套

1.配置多核心和頻率高的cpu,多核心可以執(zhí)行多個(gè)線程.

2.配置大內(nèi)存,提高內(nèi)存,即可提高緩存區(qū)容量,因此能減少磁盤I/O時(shí)間,從而提高響應(yīng)速度.

3.配置高速磁盤或合理分布磁盤:高速磁盤提高I/O,分布磁盤能提高并行操作的能力.

2.2.2 優(yōu)化數(shù)據(jù)庫參數(shù)

優(yōu)化數(shù)據(jù)庫參數(shù)可以提高資源利用率,從而提高M(jìn)ySQL服務(wù)器性能.MySQL服務(wù)的配置參數(shù)都在my.cnf或my.ini,下面列出性能影響較大的幾個(gè)參數(shù).

2.2.3 分庫分表

因?yàn)閿?shù)據(jù)庫壓力過大,首先一個(gè)問題就是高峰期系統(tǒng)性能可能會(huì)降低,因?yàn)閿?shù)據(jù)庫負(fù)載過高對(duì)性能會(huì)有影響。另外一個(gè),壓力過大把你的數(shù)據(jù)庫給搞掛了怎么辦?所以此時(shí)你必須得對(duì)系統(tǒng)做分庫分表 + 讀寫分離,也就是把一個(gè)庫拆分為多個(gè)庫,部署在多個(gè)數(shù)據(jù)庫服務(wù)上,這時(shí)作為主庫承載寫入請(qǐng)求。然后每個(gè)主庫都掛載至少一個(gè)從庫,由從庫來承載讀請(qǐng)求。

2.2.4 緩存集群

如果用戶量越來越大,此時(shí)你可以不停的加機(jī)器,比如說系統(tǒng)層面不停加機(jī)器,就可以承載更高的并發(fā)請(qǐng)求。然后數(shù)據(jù)庫層面如果寫入并發(fā)越來越高,就擴(kuò)容加數(shù)據(jù)庫服務(wù)器,通過分庫分表是可以支持?jǐn)U容機(jī)器的,如果數(shù)據(jù)庫層面的讀并發(fā)越來越高,就擴(kuò)容加更多的從庫。但是這里有一個(gè)很大的問題:數(shù)據(jù)庫其實(shí)本身不是用來承載高并發(fā)請(qǐng)求的,所以通常來說,數(shù)據(jù)庫單機(jī)每秒承載的并發(fā)就在幾千的數(shù)量級(jí),而且數(shù)據(jù)庫使用的機(jī)器都是比較高配置,比較昂貴的機(jī)器,成本很高。如果你就是簡(jiǎn)單的不停的加機(jī)器,其實(shí)是不對(duì)的。所以在高并發(fā)架構(gòu)里通常都有緩存這個(gè)環(huán)節(jié),緩存系統(tǒng)的設(shè)計(jì)就是為了承載高并發(fā)而生。所以單機(jī)承載的并發(fā)量都在每秒幾萬,甚至每秒數(shù)十萬,對(duì)高并發(fā)的承載能力比數(shù)據(jù)庫系統(tǒng)要高出一到兩個(gè)數(shù)量級(jí)。所以你完全可以根據(jù)系統(tǒng)的業(yè)務(wù)特性,對(duì)那種寫少讀多的請(qǐng)求,引入緩存集群。具體來說,就是在寫數(shù)據(jù)庫的時(shí)候同時(shí)寫一份數(shù)據(jù)到緩存集群里,然后用緩存集群來承載大部分的讀請(qǐng)求。這樣的話,通過緩存集群,就可以用更少的機(jī)器資源承載更高的并發(fā)。

一個(gè)完整而復(fù)雜的高并發(fā)系統(tǒng)架構(gòu)中,一定會(huì)包含:各種復(fù)雜的自研基礎(chǔ)架構(gòu)系統(tǒng)。各種精妙的架構(gòu)設(shè)計(jì).因此一篇小文頂多具有拋磚引玉的效果,但是數(shù)據(jù)庫優(yōu)化的思想差不多就這些了.

北大青鳥設(shè)計(jì)培訓(xùn):mysql數(shù)據(jù)庫的優(yōu)化方法?

我們都知道,服務(wù)器數(shù)據(jù)庫的開發(fā)一般都是通過java或者是PHP語言來編程實(shí)現(xiàn)的,而為了提高我們數(shù)據(jù)庫的運(yùn)行速度和效率,數(shù)據(jù)庫優(yōu)化也成為了我們每日的工作重點(diǎn),今天,昌平IT培訓(xùn)就一起來了解一下mysql服務(wù)器數(shù)據(jù)庫的優(yōu)化方法。

為什么要了解索引真實(shí)案例案例一:大學(xué)有段時(shí)間學(xué)習(xí)爬蟲,爬取了知乎300w用戶答題數(shù)據(jù),存儲(chǔ)到mysql數(shù)據(jù)中。

那時(shí)不了解索引,一條簡(jiǎn)單的“根據(jù)用戶名搜索全部回答的sql“需要執(zhí)行半分鐘左右,完全滿足不了正常的使用。

案例二:近線上應(yīng)用的數(shù)據(jù)庫頻頻出現(xiàn)多條慢sql風(fēng)險(xiǎn)提示,而工作以來,對(duì)數(shù)據(jù)庫優(yōu)化方面所知甚少。

例如一個(gè)用戶數(shù)據(jù)頁面需要執(zhí)行很多次數(shù)據(jù)庫查詢,性能很慢,通過增加超時(shí)時(shí)間勉強(qiáng)可以訪問,但是性能上需要優(yōu)化。

索引的優(yōu)點(diǎn)合適的索引,可以大大減小mysql服務(wù)器掃描的數(shù)據(jù)量,避免內(nèi)存排序和臨時(shí)表,提高應(yīng)用程序的查詢性能。

索引的類型mysql數(shù)據(jù)中有多種索引類型,primarykey,unique,normal,但底層存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)都是BTREE;有些存儲(chǔ)引擎還提供hash索引,全文索引。

BTREE是常見的優(yōu)化要面對(duì)的索引結(jié)構(gòu),都是基于BTREE的討論。

B-TREE查詢數(shù)據(jù)簡(jiǎn)單暴力的方式是遍歷所有記錄;如果數(shù)據(jù)不重復(fù),就可以通過組織成一顆排序二叉樹,通過二分查找算法來查詢,大大提高查詢性能。

而BTREE是一種更強(qiáng)大的排序樹,支持多個(gè)分支,高度更低,數(shù)據(jù)的插入、刪除、更新更快。

現(xiàn)代數(shù)據(jù)庫的索引文件和文件系統(tǒng)的文件塊都被組織成BTREE。

btree的每個(gè)節(jié)點(diǎn)都包含有key,data和只想子節(jié)點(diǎn)指針。

btree有度的概念d=1。

假設(shè)btree的度為d,則每個(gè)內(nèi)部節(jié)點(diǎn)可以有n=[d+1,2d+1)個(gè)key,n+1個(gè)子節(jié)點(diǎn)指針。

樹的大高度為h=Logb[(N+1)/2]。

索引和文件系統(tǒng)中,B-TREE的節(jié)點(diǎn)常設(shè)計(jì)成接近一個(gè)內(nèi)存頁大小(也是磁盤扇區(qū)大小),且樹的度非常大。

這樣磁盤I/O的次數(shù),就等于樹的高度h。

假設(shè)b=100,一百萬個(gè)節(jié)點(diǎn)的樹,h將只有3層。

即,只有3次磁盤I/O就可以查找完畢,性能非常高。

索引查詢建立索引后,合適的查詢語句才能大發(fā)揮索引的優(yōu)勢(shì)。

另外,由于查詢優(yōu)化器可以解析客戶端的sql語句,會(huì)調(diào)整sql的查詢語句的條件順序去匹配合適的索引。

怎樣優(yōu)化“mysql數(shù)據(jù)庫”來提高“mysql性能”?

優(yōu)化“mysql數(shù)據(jù)庫”來提高“mysql性能”的方法有:

1、選取最適用的字段屬性。

MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說來,數(shù)據(jù)庫中的表越小,在它上面執(zhí)行的查詢也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。

2、使用連接(JOIN)來代替子查詢(Sub-Queries)。

MySQL從4.1開始支持SQL的子查詢。這個(gè)技術(shù)可以使用SELECT語句來創(chuàng)建一個(gè)單列的查詢結(jié)果,然后把這個(gè)結(jié)果作為過濾條件用在另一個(gè)查詢中。

3、使用聯(lián)合(UNION)來代替手動(dòng)創(chuàng)建的臨時(shí)表。 ?

MySQL 從4.0的版本開始支持UNION查詢,它可以把需要使用臨時(shí)表的兩條或更多的SELECT查詢合并的一個(gè)查詢中。在客戶端的查詢會(huì)話結(jié)束的時(shí)候,臨時(shí)表會(huì)被自動(dòng)刪除,從而保證數(shù)據(jù)庫整齊、高效。

4、事務(wù)。

要把某個(gè)數(shù)據(jù)同時(shí)插入兩個(gè)相關(guān)聯(lián)的表中,可能會(huì)出現(xiàn)這樣的情況:第一個(gè)表中成功更新后,數(shù)據(jù)庫突然出現(xiàn)意外狀況,造成第二個(gè)表中的操作沒有完成,這樣,就會(huì)造成數(shù)據(jù)的不完整,甚至?xí)茐臄?shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么語句塊中每條語句都操作成功,要么都失敗。

5、鎖定表。

盡管事務(wù)是維護(hù)數(shù)據(jù)庫完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會(huì)影響數(shù)據(jù)庫的性能,尤其是在很大的應(yīng)用系統(tǒng)中。由于在事務(wù)執(zhí)行的過程中,數(shù)據(jù)庫將會(huì)被鎖定,因此其它的用戶請(qǐng)求只能暫時(shí)等待直到該事務(wù)結(jié)束。

6、使用外鍵。

鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵。

7、使用索引?

索引是提高數(shù)據(jù)庫性能的常用方法,它可以令數(shù)據(jù)庫服務(wù)器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當(dāng)中包含有MAX(), MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯。

8、優(yōu)化的查詢語句?

絕大多數(shù)情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當(dāng)?shù)脑?,索引將無法發(fā)揮它應(yīng)有的作用。

當(dāng)前題目:怎么提高mysql性能 mysql性能提升
標(biāo)題網(wǎng)址:http://muchs.cn/article2/ddcigic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作小程序開發(fā)、外貿(mào)建站、網(wǎng)站排名、商城網(wǎng)站軟件開發(fā)

廣告

聲明:本網(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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司