婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 理解MySQL查詢優(yōu)化處理過程

理解MySQL查詢優(yōu)化處理過程

熱門標(biāo)簽:400電話辦理服務(wù)價(jià)格最實(shí)惠 呂梁外呼系統(tǒng) 大豐地圖標(biāo)注app 400電話變更申請 武漢電銷機(jī)器人電話 html地圖標(biāo)注并導(dǎo)航 北京金倫外呼系統(tǒng) 南太平洋地圖標(biāo)注 催天下外呼系統(tǒng)

MySQL查詢優(yōu)化需要經(jīng)過解析、預(yù)處理和優(yōu)化三個步驟。在這些過程中,都有可能發(fā)生錯誤。本篇文章不會深入討論錯誤處理,而是幫助理解 MySQL 執(zhí)行查詢的方式,以便可以寫出更好的查詢語句。

解析器和預(yù)處理器

一開始,MySQL 的解析器將查詢語句拆分成一系列指令并從中構(gòu)建一棵“解析樹”。解析器使用 MySQL 的SQL 語法去翻譯和驗(yàn)證查詢語句。例如,解析器保證了查詢中的指令是有效且次序正確,并且會檢查那種類似字符串引號未配對的錯誤。

預(yù)處理器則檢查構(gòu)建好的解析樹中那些解析器無法處理的語義信息。例如,檢查數(shù)據(jù)表和列是否存在,并且處理字段名稱和別名以保證列引用沒有歧義。接下來,預(yù)處理器會檢查權(quán)限,通常這會非常快(除非你的服務(wù)端有一大堆權(quán)限配置)。

查詢優(yōu)化器

經(jīng)過解析器和預(yù)處理器后,解析樹就被確定是有效的了,可以被優(yōu)化器進(jìn)行處理并最終轉(zhuǎn)變?yōu)橐粋€查詢計(jì)劃。一個具有相同結(jié)果的查詢通常有很多種執(zhí)行方式,而優(yōu)化器的職責(zé)是找出其中最優(yōu)的選項(xiàng)。

MySQL使用基于代價(jià)估計(jì)的優(yōu)化器,這意味著它視圖預(yù)測眾多執(zhí)行計(jì)劃的代價(jià),并選擇代價(jià)最低的那個。最初的單位成本是隨機(jī)的4KB 數(shù)據(jù)頁讀取,而現(xiàn)在變得更為復(fù)雜,包括了如執(zhí)行 WHERE比較條件的代價(jià)。可以通過顯示 Last_query_cost 會話變量來查看查詢優(yōu)化器估計(jì)查詢語句的代價(jià)。

SELECT SQL_NO_CACHE COUNT(*) FROM sakila.film_actor;
SHOW STATUS LIKE 'Last_query_cost';

顯示的 Last_query_cost 意味著優(yōu)化器估計(jì)需要執(zhí)行對應(yīng)次數(shù)的隨機(jī)數(shù)據(jù)頁訪問才能完成查詢。這是基于如下統(tǒng)計(jì)估算的結(jié)果:

  • 數(shù)據(jù)表或索引占據(jù)的數(shù)據(jù)頁數(shù);
  • 索引的候選值;
  • 數(shù)據(jù)行、鍵及鍵值分布對應(yīng)的數(shù)據(jù)長度。

優(yōu)化器并不會考慮估計(jì)內(nèi)容的緩存——它假設(shè)每次都從磁盤 I/O 讀取結(jié)果。優(yōu)化器并不是每次都能選擇最優(yōu)的執(zhí)行計(jì)劃,原因如下:

  • 統(tǒng)計(jì)本身可能是錯誤的。服務(wù)端的統(tǒng)計(jì)結(jié)果依賴于存儲引擎,而存儲引擎可能十分準(zhǔn)確也可能很不準(zhǔn)確。例如,InnoDB 由于其 MVCC 架構(gòu),并不保留數(shù)據(jù)表的準(zhǔn)確行數(shù)。
  • 估計(jì)的代價(jià)和實(shí)際運(yùn)行的代價(jià)并不等價(jià),因此即便統(tǒng)計(jì)是準(zhǔn)確的,查詢的代價(jià)與 MySQL 的估計(jì)也會或多或少存在偏差。一個讀取更多數(shù)據(jù)頁的查詢計(jì)劃也可能代價(jià)更低,例如如果是有序的磁盤 I/O 訪問就會更快,又或是結(jié)果本身就已經(jīng)在緩存中。因此,優(yōu)化器本身并不知道查詢會引起多少次 I/O 操作。
  • MySQL 人為的優(yōu)化也許與我們期待的不同。我們要的可能是更快的執(zhí)行時間,而 MySQL 并不是只追求快,它是最求最小化代價(jià)。因此,通過代價(jià)并不一定科學(xué)。
  • MySQL并不考慮并發(fā)中的查詢,而這可能會影響查詢運(yùn)行的速度。
  • MySQL 并不是一直都按代價(jià)估計(jì)做優(yōu)化。有時候僅僅是遵循一些規(guī)則,例如如果有一個全文匹配條件(MATCH 方法)則使用全文索引。即便是有一個更快的的其他索引和非全文條件查詢,MySQL 也不會按更快的方式執(zhí)行查詢。
  • 優(yōu)化器對于不歸它控制的操作的代價(jià)并不會考慮,例如執(zhí)行存儲過程或自定義函數(shù)。
  • 優(yōu)化器并不總是能夠估計(jì)每一個執(zhí)行計(jì)劃,有些時候它會忽略一個更優(yōu)的計(jì)劃。

MySQL 查詢優(yōu)化器是其中非常復(fù)雜的一部分,使用了很多優(yōu)化方式將查詢語句轉(zhuǎn)換成為一個查詢執(zhí)行計(jì)劃。通常有兩種優(yōu)化方式:靜態(tài)優(yōu)化和動態(tài)優(yōu)化。靜態(tài)優(yōu)化可以簡單地通過檢查解析樹進(jìn)行。例如,優(yōu)化器可以將 WHERE 條件通過數(shù)學(xué)運(yùn)算規(guī)則轉(zhuǎn)換成一個等式。靜態(tài)優(yōu)化與具體的值無關(guān),例如 WHERE條件的常量值。他們執(zhí)行一次后會一直有效,即便是查詢語句使用了不同的值再次執(zhí)行。可以理解為是“編譯時優(yōu)化”。

相反,動態(tài)優(yōu)化是基于具體的情景的,并依賴于多種因素。例如,WHERE 條件中的值或索引中對應(yīng)的數(shù)據(jù)行數(shù)。這個過程在每次查詢都需要重新估計(jì),可以理解為是“運(yùn)行時優(yōu)化”。以下是一些 MySQL 的典型優(yōu)化方式:

  • 聯(lián)合查詢重新排序:數(shù)據(jù)表并不一定需要按照查詢語句的順序聯(lián)合。決定最優(yōu)的聯(lián)合查詢次序是十分重要的優(yōu)化。
  • 將外聯(lián)接轉(zhuǎn)換為內(nèi)聯(lián)接:一個外聯(lián)接并不一定需要按外聯(lián)接查詢。有些因素,例如 WHERE 條件和數(shù)據(jù)表結(jié)構(gòu)可以將外聯(lián)接查詢等價(jià)于內(nèi)聯(lián)接。MySQL 可以識別這些情況,并重寫聯(lián)合查詢。
  • 應(yīng)用數(shù)學(xué)等價(jià)公式:MySQL 應(yīng)用數(shù)學(xué)等價(jià)轉(zhuǎn)換簡化表達(dá)式。可以做到展開和減少常量,排除不可能的情況和常量表達(dá)式。例如,表達(dá)式(5=5 AND a>5)會精簡為(a>5)。同樣的,(a 5 AND b=c AND a=5.這些規(guī)則對帶條件的查詢十分有用。
  • COUNT(),MIN()和 MAX()優(yōu)化:索引和空值列通常可以幫助 MySQL 優(yōu)化這些函數(shù)。例如,查找二叉樹最左側(cè)一列的最小值時,MySQL 可以只請求索引的第一行數(shù)據(jù)。甚至可以在查詢優(yōu)化階段完成這個事情,而對于剩余的查詢當(dāng)作是常量值。而對于查詢最大值也是一樣,只需要讀取最后u 一行即可。如果服務(wù)端使用了這種優(yōu)化,可以在 EXPLAIN 中看到“Select tables optimized away”。這意味著優(yōu)化器將數(shù)據(jù)表從查詢計(jì)劃中移除并用常量替代了。類似地,COUNT(*)查詢在沒有指定 WHERE 條件時也可以在某些存儲引擎被優(yōu)化(例如 MyISAM,會一直保存數(shù)據(jù)表的準(zhǔn)確行數(shù))。
  • 評估和精簡常量表達(dá)式:一旦 MySQL 檢測到一個表達(dá)式可以精簡為一個常量,那在優(yōu)化階段就會完成該操作。例如,一個用戶定義的變量如果在查詢過程中沒有變化,就可以轉(zhuǎn)換為常量。令人驚奇的是,在優(yōu)化階段,有些你認(rèn)為是一個查詢的語句也會被轉(zhuǎn)換為常量。一個例子就是 索引上的MIN()。這種情況也可以擴(kuò)展到對主鍵或獨(dú)立索引的常量查詢。如果 WHERE 條件對這樣的索引指定了常量,優(yōu)化器會知道 MySQL 會在查詢開始就查找對應(yīng)的值。然后,就會在剩余的查詢中把這個值當(dāng)做常量處理。下面是一個例子:
EXPLAIN SELECT film.film_id, film_actor.actor_id
FROM sakila.film
	INNER JOIN sakila.film_actor USING(film_id)
WHERE film.film_id = 1;

MySQL 會將這個查詢拆分為2步,因此分析結(jié)果會有兩行。第一步是是在 film 表中查找對應(yīng)的數(shù)據(jù)行。由于 是按主鍵film_id查詢的,MySQL 知道只有一行數(shù)據(jù)。 因此,此時的查詢分析結(jié)果的 ref 是常量。在第二步中,MySQL 會將 film_id 作為已知值,因此對 film_actor 的查詢的 ref 也是常量。其他類似的場景還有 WHERE,USING或 ON 條件中的約束條件是等式。在這個例子中,MySQL 知道 USING條件的 film_id 在查詢語句中都是相同的值,這個值必須和 WHERE條件的 film_id 相同。

  • 覆蓋索引:MySQL 有時候會利用索引數(shù)據(jù)而避免讀數(shù)行數(shù)據(jù),如果索引包含了查詢所需的全部列的話。
  • 子查詢優(yōu)化:MySQL 能夠?qū)⒁恍╊愋偷淖硬樵冝D(zhuǎn)換為更有效的變體形式,從而簡化它們?yōu)樗饕樵兌皇窍嗷オ?dú)立的查詢。
  • 提前中止:MySQL 可以在滿足查詢結(jié)果后提前中止查詢過程。最明顯的例子是 LIMIT條件。也有一些其他的提前中止的情形。例如,MySQL 檢測導(dǎo)一個可能條件后,可以中止整個查詢,如下面的例子所示:
EXPLAIN SELECT film.film_id FROM sakila.film WHERE film_id=1;

在分析結(jié)果中的 Extra字段會看到“Impossible WHERE noticed after reading const tables”。在其他情形也會有提前中止的情況,例如:

SELECT film.film_id
FROM sakila.film
	LEFT OUTER JOIN sakila.film_actor USING(film_id)
WHERE sakila.film_actor.film_id IS NULL;

這個查詢排除那些有演員的電影。每部電源都可能有多名演員,但是只要找到一名演員后,MySQL 就會停止處理當(dāng)前的這部電影,而去處理下一部。對于 DISTINCT,NOT EXISTS 也會有類似的情況。

  • 等效傳遞:MySQL 會識別導(dǎo)查詢語句中保持的列是否是等效的。例如,在 JOIN 條件中,WHERE 條件會影響導(dǎo)相同的列,如下面的查詢:
SELECT film.film_id
FROM sakila.film
	INNER JOIN sakila.film_actor USING(film_id)
WHERE film.film_id > 500;

MySQL 會知道 WHERE 條件的約束不僅適用于 film 表,同樣也適用于 film_actor 表。但對于其他數(shù)據(jù)庫則未必會有這樣的優(yōu)化效果。

  • IN 查詢比較:對于很多數(shù)據(jù)庫服務(wù)器,IN 查詢比等價(jià)為多個 OR 條件,在邏輯上二者是等效的。但在 MySQL 中不是這樣,MySQL會對 IN 查詢的列表值進(jìn)行排序,并使用二分查找法去檢查查詢值是否在列表中。這會使得算法復(fù)雜度從 O(n)降低導(dǎo) O(log n)。

實(shí)際上,MySQL 使用的優(yōu)化手段比上述列舉的多得多,這里沒法一一列舉。只是需要記住 MySQL 的優(yōu)化器的復(fù)雜性及其智能化程度。因此,應(yīng)當(dāng)讓優(yōu)化器發(fā)揮其作用,而不是無限優(yōu)化查詢語句直到 MySQL 的優(yōu)化器沒有用武之地。當(dāng)然,雖然 MySQL 的優(yōu)化器很聰明,但是它給出的并不一定是最優(yōu)結(jié)果,有些時候你知道最優(yōu)結(jié)果,而 MySQL 未必知道。這種情況下,你可以對查詢語句進(jìn)行優(yōu)化從而幫助 MySQL 完成優(yōu)化工作,而有些時候則需要增加查詢的提示,或是重寫查詢,修改數(shù)據(jù)表設(shè)計(jì)或增加索引。

以上就是理解MySQL查詢優(yōu)化處理過程的詳細(xì)內(nèi)容,更多關(guān)于MySQL 查詢優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL百萬級數(shù)據(jù)分頁查詢優(yōu)化方案
  • MySQL 使用自定義變量進(jìn)行查詢優(yōu)化
  • mysql查詢優(yōu)化之100萬條數(shù)據(jù)的一張表優(yōu)化方案
  • 詳解MySQL 聯(lián)合查詢優(yōu)化機(jī)制
  • MySQL查詢優(yōu)化必備知識點(diǎn)總結(jié)
  • MySQL查詢優(yōu)化之查詢慢原因和解決技巧
  • MySQL之select in 子查詢優(yōu)化的實(shí)現(xiàn)
  • MySQL千萬級大數(shù)據(jù)SQL查詢優(yōu)化知識點(diǎn)總結(jié)
  • Mysql慢查詢優(yōu)化方法及優(yōu)化原則
  • 通過MySQL慢查詢優(yōu)化MySQL性能的方法講解
  • MySQL 百萬級數(shù)據(jù)的4種查詢優(yōu)化方式

標(biāo)簽:龍巖 南充 麗水 無錫 迪慶 徐州 西寧 自貢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《理解MySQL查詢優(yōu)化處理過程》,本文關(guān)鍵詞  理解,MySQL,查詢,優(yōu)化,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《理解MySQL查詢優(yōu)化處理過程》相關(guān)的同類信息!
  • 本頁收集關(guān)于理解MySQL查詢優(yōu)化處理過程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91久久奴性调教| 欧美精品一区在线观看| 国产盗摄视频一区二区三区| 99精品久久只有精品| 国产女主播一区| 国产91精品欧美| 亚洲欧洲精品一区二区三区不卡| 精品人在线二区三区| 激情五月婷婷综合| 国产精品欧美久久久久无广告 | 精品播放一区二区| 国内精品伊人久久久久av一坑| 国产拍欧美日韩视频二区| av午夜精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 欧美在线不卡视频| 毛片基地黄久久久久久天堂| 日本一区二区三区在线不卡| 一本一本大道香蕉久在线精品 | www.一区二区| 夜夜精品视频一区二区| 91精品国产入口| 国产不卡视频在线观看| 亚洲精品国产品国语在线app| 欧美高清一级片在线| 国产精品 欧美精品| 亚洲欧美日韩国产综合| 欧美一区二区三区在线视频| 成人av免费网站| 久国产精品韩国三级视频| 国产精品久99| 精品粉嫩超白一线天av| 在线观看视频91| 成人午夜在线播放| 久久国产精品一区二区| 亚洲在线观看免费| 欧美激情一区二区三区在线| 91精品在线一区二区| 在线看一区二区| 成人黄动漫网站免费app| 毛片一区二区三区| 亚洲成年人影院| 亚洲人成网站影音先锋播放| 亚洲精品在线免费观看视频| 欧美片网站yy| 91久久国产综合久久| 国产成人精品一区二区三区四区 | 精品国产制服丝袜高跟| 91久久线看在观草草青青| 国产精品一二一区| 另类欧美日韩国产在线| 亚洲高清不卡在线观看| 国产精品久久久久久久裸模| 亚洲精品一线二线三线| 欧美一卡二卡在线| 日韩一级成人av| 欧美一卡2卡三卡4卡5免费| 欧美日韩三级在线| 欧美精品高清视频| 777午夜精品免费视频| 67194成人在线观看| 4438亚洲最大| 日韩女优av电影| 欧美大片在线观看| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩午夜精品视频| 久久久高清一区二区三区| 26uuu欧美| 久久这里只精品最新地址| xfplay精品久久| 国产精品久久久久久亚洲伦| 国产精品三级电影| 国产精品伦理一区二区| 国产精品久久久久久久久免费桃花 | 一区二区三区四区高清精品免费观看| 国产精品毛片大码女人| 中文字幕一区二区三| 国产精品不卡在线| 亚洲男人的天堂在线观看| 中文字幕一区二区三区色视频 | 亚洲欧美色综合| 一卡二卡三卡日韩欧美| 日韩精品乱码免费| 国产一区二区三区久久久| 国产99精品视频| 91亚洲精品久久久蜜桃网站| 欧美性高清videossexo| 日韩精品一区二区三区在线观看| 亚洲精品在线三区| 一区二区三区在线不卡| 美女视频第一区二区三区免费观看网站| 激情深爱一区二区| 91丨porny丨中文| 精品久久一区二区三区| 一区二区三区日韩| 毛片基地黄久久久久久天堂| 97久久精品人人做人人爽| 在线播放欧美女士性生活| 精品入口麻豆88视频| 一区二区三区在线观看视频| 久久99国内精品| 91丨porny丨首页| 精品国产污污免费网站入口| 亚洲尤物视频在线| 国产91精品露脸国语对白| 欧美日本国产视频| 国产精品剧情在线亚洲| 蜜臀久久久99精品久久久久久| 成人一区二区三区视频| 欧美精品乱人伦久久久久久| 日本一区二区免费在线观看视频 | 亚洲三级免费电影| 国产乱一区二区| 欧美一卡二卡三卡| 一区二区免费看| 不卡电影一区二区三区| 精品欧美一区二区三区精品久久| 亚洲免费在线观看视频| 国产成人在线观看| 欧美一二三区精品| 亚洲成人午夜影院| 99精品久久免费看蜜臀剧情介绍| 久久综合av免费| 麻豆精品视频在线观看视频| 欧美日韩视频在线第一区| 亚洲精品视频一区二区| 国产一区三区三区| 欧美va亚洲va香蕉在线| 日本亚洲天堂网| 欧美日精品一区视频| 亚洲一级在线观看| 欧美日韩综合色| 婷婷亚洲久悠悠色悠在线播放| 色偷偷久久人人79超碰人人澡| 国产精品天天摸av网| 国产一区二区不卡在线| 精品久久人人做人人爱| 美腿丝袜亚洲综合| 精品日韩99亚洲| 国内成人免费视频| 国产偷国产偷亚洲高清人白洁| 国产福利精品一区| 国产精品久久久久久亚洲毛片 | 亚洲一区二区三区在线播放| 色成年激情久久综合| 亚洲午夜在线视频| 欧美日韩1234| 九一九一国产精品| 国产欧美一区二区精品婷婷| 99久久久精品免费观看国产蜜| 亚洲视频免费观看| 欧美日韩成人激情| 奇米色一区二区三区四区| 欧美va亚洲va香蕉在线| 国产精品一品二品| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 久久综合久色欧美综合狠狠| 国产精品一区二区你懂的| 国产精品国产三级国产普通话蜜臀| 成人国产免费视频| 亚洲一区二区三区四区五区中文| 日韩欧美亚洲国产另类| 韩国v欧美v日本v亚洲v| 国产日韩欧美麻豆| 91毛片在线观看| 老汉av免费一区二区三区| 国产精品婷婷午夜在线观看| 欧洲激情一区二区| 热久久国产精品| 欧美激情艳妇裸体舞| 99久久国产免费看| 裸体在线国模精品偷拍| 中文字幕一区二区在线观看| 欧美一区永久视频免费观看| 国产麻豆精品在线| 亚洲国产乱码最新视频| 国产欧美久久久精品影院| 欧美日韩成人综合| 成人免费看黄yyy456| 日韩影院精彩在线| ...xxx性欧美| 日韩免费看的电影| 国产精品一区专区| 日本系列欧美系列| 自拍av一区二区三区| 精品久久久久久久久久久院品网 | 亚洲色图清纯唯美| 26uuu国产在线精品一区二区| 色综合天天综合| 国产麻豆视频一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲黄网站在线观看| 国产精品美女一区二区| 久久久久久久一区| 欧美一区二区在线观看| 在线亚洲人成电影网站色www| 懂色av噜噜一区二区三区av| 精东粉嫩av免费一区二区三区| 日韩福利视频导航| 婷婷开心激情综合|