溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL數(shù)據(jù)庫優(yōu)化的方式分享

發(fā)布時間:2021-08-27 09:12:21 來源:億速云 閱讀:157 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“MYSQL數(shù)據(jù)庫優(yōu)化的方式分享”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MYSQL數(shù)據(jù)庫優(yōu)化的方式分享”吧!

如果在一個系統(tǒng)中,用戶反映系統(tǒng)太卡,那么我們可以怎么進行優(yōu)化呢?

  1. 如果http請求過多,則可以認定是web服務器承受的壓力過大,可以增加web服務器,做負載均衡進行優(yōu)化。

  2. 如果我們訪問靜態(tài)界面不卡頓,但是申請動態(tài)數(shù)據(jù)的時候發(fā)生卡頓,說明我們數(shù)據(jù)庫所處理的請求過多,這時候有大量的查詢壓力到數(shù)據(jù)庫,這時候就需要考慮數(shù)據(jù)庫的優(yōu)化了。


要想知道我們數(shù)據(jù)庫優(yōu)化究竟在做一些什么事情,首先我們需要了解MYSQL的執(zhí)行過程。

MYSQL數(shù)據(jù)庫優(yōu)化的方式分享

圖源自網(wǎng)絡,如有侵權(quán)請聯(lián)系刪除。

mysql執(zhí)行過程

  1. 當我們請求連接mysql服務器時,mysql會對請求有一個監(jiān)聽,當我們發(fā)起的請求到達以后,服務器得到我們需要執(zhí)行的SQL語句,這時我們的SQL語句就進入MYSQL的內(nèi)部。

  2. MYSQL會首先查詢緩存,看這個SQL語句是否執(zhí)行過,如果我們執(zhí)行過這個SQL語句,則把緩存中的執(zhí)行結(jié)果返回,但是在MYSQL中,這個查詢緩存默認是不開啟的,因為查詢緩存要求SQL語句和參數(shù)都要一樣,所以基本上緩存中的數(shù)據(jù)我們都命中不了。

  3. 如果我們沒有開啟查詢緩存,或者查詢緩存卻沒有找到對應的結(jié)果,這時候SQL語句就傳到了解析器中。解析器會對要執(zhí)行的SQL語句進行解析,然后SQL語句就變成一顆解析樹,這時候解析樹不能馬上就執(zhí)行,還需要對解析樹進行預處理,預處理的目的在于規(guī)定常量的存儲位置,計算表達式并返回結(jié)果等。

  4. 預處理結(jié)束后,此時這棵樹就是要進行執(zhí)行的樹,在和初始的解析樹對比,這棵樹得到了一些優(yōu)化。


MYSQL數(shù)據(jù)庫里面最關(guān)鍵的知識點,就是查詢優(yōu)化器。比如我們寫這么一條SQL語句:SELECT  *  FROM  BOOK  WHERE  BOOKNAME = 'BODY'  AND  PRICE  =  56,只是SQL語句會怎么去進行執(zhí)行呢?它會先執(zhí)行BOOKNAME = 'BODY'還是 PRICE  =  56呢?SQL語句的執(zhí)行順序就是根據(jù)數(shù)據(jù)庫對數(shù)據(jù)統(tǒng)計表的一些信息,比如索引或者表中一共有多少行數(shù)據(jù),MYSQL數(shù)據(jù)庫都是會進行緩存的,這時查詢優(yōu)化器就會根據(jù)這些數(shù)據(jù)進行一個判定,判斷這一個SQL語句的執(zhí)行過程中到底選擇哪種執(zhí)行方式,運行結(jié)果可能更快。所以說這一步操作其實是MYSQL性能中最關(guān)鍵的核心,這也是我們優(yōu)化所需要遵循的原則。

所以說我們平常所說的優(yōu)化SQL,其實就是想讓查詢優(yōu)化器能按照我們的想法,選擇最佳的執(zhí)行方案,因為我們更清楚的知道我們的數(shù)據(jù),而MYSQL看到的數(shù)據(jù)僅僅是自己收集到緩存的那一部分信息,而這些信息的正確性不能得以保證,MYSQL根據(jù)它收集到的信息選擇一個它認為最佳的執(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é)果存放到查詢緩存中,下一次進行該查詢會直接在查詢緩存中返回執(zhí)行結(jié)果。

到此,相信大家對“MYSQL數(shù)據(jù)庫優(yōu)化的方式分享”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI