站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        MySQL性能調(diào)優(yōu)之查詢優(yōu)化

        本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識,其中主要介紹了關(guān)于性能優(yōu)化的相關(guān)問題,包括了查詢優(yōu)化等內(nèi)容,下面一起來看一下,希望對大家有幫助。

        MySQL性能調(diào)優(yōu)之查詢優(yōu)化

        推薦學(xué)習(xí):mysql視頻教程

        在編寫快速的查詢之前,需要清楚一點,真正重要的是響應(yīng)時間,而且要知道在整個SQL語句的執(zhí)行過程中每個步驟都花費了多長時間,要知道哪些步驟是拖垮執(zhí)行效率的關(guān)鍵步驟,想要做到這點,必須要知道查詢的生命周期,然后進行優(yōu)化,不同的應(yīng)用場景有不同的優(yōu)化方式,不要一概而論,具體情況具體分析。

        一、查詢慢的原因

        1、網(wǎng)絡(luò)

        2、CPU

        3、IO

        4、上下文切換

        5、系統(tǒng)調(diào)用

        6、生成統(tǒng)計信息

        7、鎖等待時間

        二、優(yōu)化數(shù)據(jù)訪問

        1、查詢性能低下的主要原因是訪問的數(shù)據(jù)太多,某些查詢不可避免的需要篩選大量的數(shù)據(jù),我們可以通過減少訪問數(shù)據(jù)量的方式進行優(yōu)化

        (1)確認應(yīng)用程序是否在檢索大量超過需要的數(shù)據(jù)

        (2)確認mysql服務(wù)器層是否在分析大量超過需要的數(shù)據(jù)行

        2、是否向數(shù)據(jù)庫請求了不需要的數(shù)據(jù)

        (1)查詢不需要的記錄(我們常常會誤以為mysql會只返回需要的數(shù)據(jù),實際上mysql卻是先返回全部結(jié)果再進行計算,在日常的開發(fā)習(xí)慣中,經(jīng)常是先用select語句查詢大量的結(jié)果,然后獲取前面的N行后關(guān)閉結(jié)果集。優(yōu)化方式是在查詢后面添加limit)

        (2)多表關(guān)聯(lián)時返回全部列(select * from actor inner join film_actor using(actor_id) inner join film using(film_id) where film.title='Academy Dinosaur';select actor.* from actor…;)

        (3)總是取出全部列(在公司的企業(yè)需求中,禁止使用select *,雖然這種方式能夠簡化開發(fā),但是會影響查詢的性能,所以盡量不要使用)

        (4)重復(fù)查詢相同的數(shù)據(jù)(如果需要不斷的重復(fù)執(zhí)行相同的查詢,且每次返回完全相同的數(shù)據(jù),因此,基于這樣的應(yīng)用場景,我們可以將這部分數(shù)據(jù)緩存起來,這樣的話能夠提高查詢效率。)

        三、執(zhí)行過程的優(yōu)化

        1、查詢緩存

        在解析一個查詢語句之前,如果查詢緩存是打開的,那么mysql會優(yōu)先檢查這個查詢是否命中查詢緩存中的數(shù)據(jù),如果查詢恰好命中了查詢緩存,那么會在返回結(jié)果之前會檢查用戶權(quán)限,如果權(quán)限沒有問題,那么mysql會跳過所有的階段,就直接從緩存中拿到結(jié)果并返回給客戶端

        2、查詢優(yōu)化處理

        mysql查詢完緩存之后會經(jīng)過以下幾個步驟:解析SQL、預(yù)處理、優(yōu)化SQL執(zhí)行計劃,這幾個步驟出現(xiàn)任何的錯誤,都可能會終止查詢。

        (1)語法解析器和預(yù)處理

        mysql通過關(guān)鍵字將SQL語句進行解析,并生成一顆解析樹,mysql解析器將使用mysql語法規(guī)則驗證和解析查詢,例如驗證使用使用了錯誤的關(guān)鍵字或者順序是否正確等等,預(yù)處理器會進一步檢查解析樹是否合法,例如表名和列名是否存在,是否有歧義,還會驗證權(quán)限等等
        (2)查詢優(yōu)化器

        當語法樹沒有問題之后,相應(yīng)的要由優(yōu)化器將其轉(zhuǎn)成執(zhí)行計劃,一條查詢語句可以使用非常多的執(zhí)行方式,最后都可以得到對應(yīng)的結(jié)果,但是不同的執(zhí)行方式帶來的效率是不同的,優(yōu)化器的最主要目的就是要選擇最有效的執(zhí)行計劃。

        mysql使用的是基于成本的優(yōu)化器,在優(yōu)化的時候會嘗試預(yù)測一個查詢使用某種查詢計劃時候的成本,并選擇其中成本最小的一個。

        a、select count(*) from film_actor; show status like 'last_query_cost';

        可以看到這條查詢語句大概需要做1104個數(shù)據(jù)頁才能找到對應(yīng)的數(shù)據(jù),這是經(jīng)過一系列的統(tǒng)計信息計算來的.

        (a) 每個表或者索引的頁面?zhèn)€數(shù)

        (b) 索引的基數(shù)

        (c) 索引和數(shù)據(jù)行的長度

        (d) 索引的分布情況

        b、在很多情況下mysql會選擇錯誤的執(zhí)行計劃,原因如下:

        (a)統(tǒng)計信息不準確(InnoDB因為其mvcc的架構(gòu),并不能維護一個數(shù)據(jù)表的行數(shù)的精確統(tǒng)計信息)

        (b) 執(zhí)行計劃的成本估算不等同于實際執(zhí)行的成本(有時候某個執(zhí)行計劃雖然需要讀取

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 99在线精品视频在线观看| 精品四虎免费观看国产高清午夜| 精品国精品无码自拍自在线| 国产精品小视频免费无限app | 91精品国产福利尤物| 无码人妻一区二区三区精品视频 | 国产精品久线在线观看| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久丫精品国产亚洲av不卡| 免费国产在线精品一区| 国产69精品久久久久99尤物| 精品乱人伦一区二区三区| 久久亚洲精品成人av无码网站| 午夜精品久久久内射近拍高清| 国产偷伦精品视频| 国产观看精品一区二区三区| 国产在视频线精品视频二代| 国产精品区一区二区三在线播放 | 国产精品久久久久久影院| 精品久久久噜噜噜久久久| 欧美精品v欧洲精品| 亚洲欧美日韩久久精品| 亚洲国产精品丝袜在线观看| 久久久不卡国产精品一区二区| 国产女人18毛片水真多18精品| 91精品国产自产在线老师啪| 午夜精品免费在线观看| 久久精品这里热有精品| 久久线看观看精品香蕉国产| 国产精品视频a播放| 久久精品九九亚洲精品天堂| 五月花精品视频在线观看| 一本久久a久久精品综合夜夜| 久久亚洲国产欧洲精品一| 青草青草久热精品视频在线网站| 精品午夜久久福利大片| 亚洲精品高清国产一久久| 国产精品1024在线永久免费| 国产乱人伦偷精品视频免观看 | 久99久无码精品视频免费播放| 国产午夜精品理论片久久|