欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

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

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

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

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

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

          一、查詢慢的原因

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

          2、CPU

          3、IO

          4、上下文切換

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

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

          7、鎖等待時(shí)間

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

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

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

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

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

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

          (2)多表關(guān)聯(lián)時(shí)返回全部列(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 *,雖然這種方式能夠簡(jiǎn)化開(kāi)發(fā),但是會(huì)影響查詢的性能,所以盡量不要使用)

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

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

          1、查詢緩存

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

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

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

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

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

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

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

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

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

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

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

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

          (d) 索引的分布情況

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

          (a)統(tǒng)計(jì)信息不準(zhǔn)確(InnoDB因?yàn)槠鋗vcc的架構(gòu),并不能維護(hù)一個(gè)數(shù)據(jù)表的行數(shù)的精確統(tǒng)計(jì)信息)

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

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)