本篇內(nèi)容主要講解“MySQL數(shù)據(jù)庫優(yōu)化的方式分享”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MYSQL數(shù)據(jù)庫優(yōu)化的方式分享”吧!
創(chuàng)新互聯(lián)主要業(yè)務(wù)有網(wǎng)站營銷策劃、成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、重慶小程序開發(fā)公司、H5建站、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、成都全網(wǎng)營銷資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
如果在一個系統(tǒng)中,用戶反映系統(tǒng)太卡,那么我們可以怎么進(jìn)行優(yōu)化呢?
如果http請求過多,則可以認(rèn)定是web服務(wù)器承受的壓力過大,可以增加web服務(wù)器,做負(fù)載均衡進(jìn)行優(yōu)化。
如果我們訪問靜態(tài)界面不卡頓,但是申請動態(tài)數(shù)據(jù)的時候發(fā)生卡頓,說明我們數(shù)據(jù)庫所處理的請求過多,這時候有大量的查詢壓力到數(shù)據(jù)庫,這時候就需要考慮數(shù)據(jù)庫的優(yōu)化了。
要想知道我們數(shù)據(jù)庫優(yōu)化究竟在做一些什么事情,首先我們需要了解MYSQL的執(zhí)行過程。
圖源自網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系刪除。
mysql執(zhí)行過程
當(dāng)我們請求連接mysql服務(wù)器時,mysql會對請求有一個監(jiān)聽,當(dāng)我們發(fā)起的請求到達(dá)以后,服務(wù)器得到我們需要執(zhí)行的SQL語句,這時我們的SQL語句就進(jìn)入MYSQL的內(nèi)部。
MYSQL會首先查詢緩存,看這個SQL語句是否執(zhí)行過,如果我們執(zhí)行過這個SQL語句,則把緩存中的執(zhí)行結(jié)果返回,但是在MYSQL中,這個查詢緩存默認(rèn)是不開啟的,因為查詢緩存要求SQL語句和參數(shù)都要一樣,所以基本上緩存中的數(shù)據(jù)我們都命中不了。
如果我們沒有開啟查詢緩存,或者查詢緩存卻沒有找到對應(yīng)的結(jié)果,這時候SQL語句就傳到了解析器中。解析器會對要執(zhí)行的SQL語句進(jìn)行解析,然后SQL語句就變成一顆解析樹,這時候解析樹不能馬上就執(zhí)行,還需要對解析樹進(jìn)行預(yù)處理,預(yù)處理的目的在于規(guī)定常量的存儲位置,計算表達(dá)式并返回結(jié)果等。
預(yù)處理結(jié)束后,此時這棵樹就是要進(jìn)行執(zhí)行的樹,在和初始的解析樹對比,這棵樹得到了一些優(yōu)化。
MYSQL數(shù)據(jù)庫里面最關(guān)鍵的知識點,就是查詢優(yōu)化器。比如我們寫這么一條SQL語句:SELECT * FROM BOOK WHERE BOOKNAME = 'BODY' AND PRICE = 56,只是SQL語句會怎么去進(jìn)行執(zhí)行呢?它會先執(zhí)行BOOKNAME = 'BODY'還是 PRICE = 56呢?SQL語句的執(zhí)行順序就是根據(jù)數(shù)據(jù)庫對數(shù)據(jù)統(tǒng)計表的一些信息,比如索引或者表中一共有多少行數(shù)據(jù),MYSQL數(shù)據(jù)庫都是會進(jìn)行緩存的,這時查詢優(yōu)化器就會根據(jù)這些數(shù)據(jù)進(jìn)行一個判定,判斷這一個SQL語句的執(zhí)行過程中到底選擇哪種執(zhí)行方式,運行結(jié)果可能更快。所以說這一步操作其實是MYSQL性能中最關(guān)鍵的核心,這也是我們優(yōu)化所需要遵循的原則。
所以說我們平常所說的優(yōu)化SQL,其實就是想讓查詢優(yōu)化器能按照我們的想法,選擇最佳的執(zhí)行方案,因為我們更清楚的知道我們的數(shù)據(jù),而MYSQL看到的數(shù)據(jù)僅僅是自己收集到緩存的那一部分信息,而這些信息的正確性不能得以保證,MYSQL根據(jù)它收集到的信息選擇一個它認(rèn)為最佳的執(zhí)行方案,但是這個方案很有可能和我們想要它執(zhí)行的方案不一致。
這里說到的選擇執(zhí)行方案,其實就是剛才舉例所講的先執(zhí)行BOOKNAME = 'BODY'還是 PRICE = 56,這個執(zhí)行方案會傳給查詢執(zhí)行引擎,引擎會去執(zhí)行這一份接收到的執(zhí)行方案。這個時候有一個很重要的問題:影響這個查詢性能的最關(guān)鍵原因是什么呢?其實就是我們最常講到的IO,一條SQL語句執(zhí)行的時間,就是由這個時間段的IO來決定的。而執(zhí)行IO又是由數(shù)據(jù)庫傳過去的這個執(zhí)行方案來決定的。如果我們開啟了查詢緩存,則在將結(jié)果返回給客戶端之前,也會將執(zhí)行結(jié)果存放到查詢緩存中,下一次進(jìn)行該查詢會直接在查詢緩存中返回執(zhí)行結(jié)果。
到此,相信大家對“MYSQL數(shù)據(jù)庫優(yōu)化的方式分享”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!