bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

mysql執行計劃怎么樣,mysql執行計劃怎么生成的

Day42 Mysql 執行計劃

官方文檔 對于5.7 版本 explain的描述

10年積累的網站制作、網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先做網站設計后付款的網站建設流程,更有海門免費網站建設讓你可以放心的選擇與我們合作。

const ref range index all

const: 主鍵索引

ref: 二級索引

range: 索引的范圍掃描

index: 比如用到了聯合索引 比如 a,b,c,走的是聯合索引

all: 全表掃描

rows: 需要逐行去掃描的記錄數

filted: 起作用的比例

!!!上線前sql一定要進行預執行

explain變種

const: 表中只有一條元素匹配時為system.

最好達到range級別,最差要到ref級別。

utf-8: 數字或者字母= 1字節 ,漢子占三個字節。

type 表示 關聯類型

ref 代表查找值所 用到的列或者常量 ,常見的有const,字段名

Mysql學會查看sql的執行計劃

首先在Mysql的服務中有 連接器、查詢緩存(Mysql8 已經刪除)、分析器、優化器、執行器等,所有跨存儲引擎的功能都在這一層實現

而一條sql怎么執行是由優化器決定的,?優化器是在表里面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。

而執行計劃就是優化器優化后的sql的執行的詳細方案

Mysql中查看執行計劃的方式有兩種 : 1. 使用desc? ? 2.使用 explain? 使用它倆的效果是一樣的

接下來要通過執行計劃知道sql是怎么執行的

執行計劃中有幾個重要的字段, 分別是?

id,? table,? type,? possible_keys,? key,? key_len, Extra

id :? 可以通過ID來查看在多表聯查中sql是先查詢哪張表的 id相同的從上往下依次執行,id不同的id大的先執行

table :? ?table當然就是查詢的表名

type :? 查詢的類型? ?查詢類型分為??ALL,??index,??range,??ref ,?eq_ref,?const(system),??null

? ? ALL: 指的全盤掃描,沒有走任何索引? ?查詢結果集大于25% 優化器可能會走全盤掃描? ?字符串查詢的時候一定要加"" 不然可能會全索引掃描(隱式轉換)? ?統計信息 失效 或者 過舊 也可能走全盤掃描? 因為優化器會參考統計信息來制定執行計劃

???index:?全索引掃描? 就是掃描整顆索引樹

? ? ? ?range: 索引范圍? 查詢索引樹的一部分范圍? ?范圍索引中 ? ? =? =? like? 的效率會比? or? ?in? 的效率高, 使用like %再前面的不走索引

ref:? ?輔助索引的等值查詢? ??????????

? ? ? ? ? ? ? ? 當查詢的數據量小,優化器也有可能會走索引的全盤掃描? 這里我就不貼圖了;

???eq_ref : 多表連接查詢中,被連接的表的連接條件列是主鍵或者唯一鍵

???const(system): 主鍵 或者 唯一鍵 的等值查詢

? ? ? ? ? ?null: 沒有數據

他們的性能是依次遞增的 全盤掃描性能最差,? const性能最高

possible_keys:? 查詢過程中可能用到的索引

key: 真正使用到的索引

key_len:? 走索引的長度

? ? 這個是怎么計算的呢???

???key_len 的計算方法 :

int 類型最長存儲4個字節長度的數字? 有not null? 是4字節? 沒有的話會花1字節存儲是不是null

tinyint 最大存儲一個字節? ? 也會花1字節來判斷是不是null

字符串類型 : 字符集 utf8mb4? 1-4字節

varchar超過255會預留2個字節存儲長度 沒超預留1個字節

key_len 永遠是你設置的長度的最大的??

聯合索引可以通過key_len 來判斷走了幾個索引

? ? 使用desc format=json select * from table 可以查看詳細情況

filtered:? 索引掃描過濾掉數據的占比

Extra: 額外的信息?

??? Using filesort :MySQL?對數據在sql層進行了排序,而不是按照表內的索引進行排序讀 取。 效率比較低

??? Using temporary :使用臨時表保存中間結果,也就是說 MySQL 在對查詢結果排序時使用了臨時表,常見于order by 或 group by。

??? Using index :表示 SQL 操作中使用了覆蓋索引(Covering Index),避免了訪問表的數據行,效率高。

??? Using index condition :表示 SQL 操作命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。

??? Using where :表示 SQL 操作使用了 where 過濾條件。

??? Select tables optimized away :基于索引優化 MIN/MAX 操作或者 MyISAM 存儲引擎優化 COUNT(*) 操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即可完成優化。

Using join buffer (Block Nested Loop) :表示 SQL 操作使用了關聯查詢或者子查詢,且需要進行嵌套循環計算

MySQL執行計劃

我們知道,當一條sql查詢語句執行時,會通過服務層中的優化器生成“查詢執行計劃”。而使用explain關鍵字可以查詢到執行的SQL查詢語句,從而知道MySQL是如何處理SQL的,即SQL的執行計劃。因此根據執行計劃我們可以選擇更好的索引和寫出更優化的查詢語句,分析我們的查詢語句或是表結構的性能瓶頸。

首先先解釋一下以上執行計劃中各列的含義:

2. PRIMARY: 如果查詢語句中包含子查詢或者UNION操作,指最外層的SELECT;

3. UNION: UNION中的第二個或后面的SELECT語句;

4. UNION RESULT: UNION 的結果;

5. SUBQUERY: 子查詢中的第一個SELECT;

6. DERIVED: 導出表的SELECT(FROM子句的子查詢)。

下面介紹在實際開發過程中,常見的幾種類型:

1. const: 表示通過索引一次就找到數據,用于比較primary key或者unique索引,很快就能找到對應的數據;

2. eq_ref: 唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配,常用于主鍵或唯一索引掃描;

3. ref: 非唯一索引掃描,返回匹配的所有行;

4. index_merge: 經常出現在使用一張表中的多個索引時,mysql會將多個索引合并在一起;

5. range: 使用一個索引檢索指定范圍的行,一般在where語句中會出現between、、、in等范圍查詢;

6. index: index連接類型與ALL相同,只是遍歷索引樹;

7. ALL: 全表掃描,找到匹配行。與index比較,ALL需要掃描磁盤數據,index值需要遍歷索引樹。

誤區:

上述圖片可以看到,key_len的值為9(即hotelID(4)+dateTime(5)),沒有使用到全部聯合索引,以下是改良后的sql語句:

此時key_len的值為14(即hotelID(4)+dateTime(5)+dateTime(5)),使用到了key中所有索引。

優化前:

很顯然,從explain執行計劃中可以看到,該sql語句使用了兩個索引,但是從我們自己的優化目標中,只需要使用IDX_DataChange_CreateTime這一個索引就夠了,以下是我們通過一些小手段影響優化器得到的優化方案:

如何理解MySQL的執行計劃

執行計劃包含的信息

id

包含一組數字,表示查詢中執行select子句或操作表的順序

文章名稱:mysql執行計劃怎么樣,mysql執行計劃怎么生成的
當前路徑:http://vcdvsql.cn/article12/heojgc.html

成都網站建設公司_創新互聯,為您提供企業網站制作自適應網站虛擬主機關鍵詞優化用戶體驗微信小程序

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站制作