亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計劃詳解

 更新時間:2018年08月13日 09:41:42   作者:擼碼那些事  
這篇文章主要給大家介紹了關(guān)于MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計劃的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的安康學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在MySQL中,我們可以通過EXPLAIN命令獲取MySQL如何執(zhí)行SELECT語句的信息,包括在SELECT語句執(zhí)行過程中表如何連接和連接的順序。

下面分別對EXPLAIN命令結(jié)果的每一列進行說明:

.select_type:表示SELECT的類型,常見的取值有:


類型 說明
SIMPLE 簡單表,不使用表連接或子查詢
PRIMARY 主查詢,即外層的查詢
UNION UNION中的第二個或者后面的查詢語句
SUBQUERY 子查詢中的第一個

.table:輸出結(jié)果集的表(表別名)

.type:表示MySQL在表中找到所需行的方式,或者叫訪問類型。常見訪問類型如下,從上到下,性能由差到最好:


ALL 全表掃描
index 索引全掃描
range 索引范圍掃描
ref 非唯一索引掃描
eq_ref 唯一索引掃描
const,system 單表最多有一個匹配行
NULL 不用掃描表或索引

1、type=ALL,全表掃描,MySQL遍歷全表來找到匹配行

一般是沒有where條件或者where條件沒有使用索引的查詢語句

EXPLAIN SELECT * FROM customer WHERE active=0;

2、type=index,索引全掃描,MySQL遍歷整個索引來查詢匹配行,并不會掃描表

一般是查詢的字段都有索引的查詢語句

EXPLAIN SELECT store_id FROM customer;

3、type=range,索引范圍掃描,常用于<、<=、>、>=、between等操作

EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20;

注意這種情況下比較的字段是需要加索引的,如果沒有索引,則MySQL會進行全表掃描,如下面這種情況,create_date字段沒有加索引:

EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ;

4、type=ref,使用非唯一索引或唯一索引的前綴掃描,返回匹配某個單獨值的記錄行

store_id字段存在普通索引(非唯一索引)

EXPLAIN SELECT * FROM customer WHERE store_id=10;

ref類型還經(jīng)常會出現(xiàn)在join操作中:

customer、payment表關(guān)聯(lián)查詢,關(guān)聯(lián)字段customer.customer_id(主鍵),payment.customer_id(非唯一索引)。表關(guān)聯(lián)查詢時必定會有一張表進行全表掃描,此表一定是幾張表中記錄行數(shù)最少的表,然后再通過非唯一索引尋找其他關(guān)聯(lián)表中的匹配行,以此達到表關(guān)聯(lián)時掃描行數(shù)最少。

因為customer、payment兩表中customer表的記錄行數(shù)最少,所以customer表進行全表掃描,payment表通過非唯一索引尋找匹配行。

EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id;

5、type=eq_ref,類似ref,區(qū)別在于使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配

eq_ref一般出現(xiàn)在多表連接時使用primary key或者unique index作為關(guān)聯(lián)條件。

film、film_text表關(guān)聯(lián)查詢和上一條所說的基本一致,只不過關(guān)聯(lián)條件由非唯一索引變成了主鍵。

EXPLAIN SELECT * FROM film film INNER JOIN film_text film_text ON film.film_id = film_text.film_id;

6、type=const/system,單表中最多有一條匹配行,查詢起來非常迅速,所以這個匹配行的其他列的值可以被優(yōu)化器在當(dāng)前查詢中當(dāng)作常量來處理

const/system出現(xiàn)在根據(jù)主鍵primary key或者 唯一索引 unique index 進行的查詢

根據(jù)主鍵primary key進行的查詢:

EXPLAIN SELECT * FROM customer WHERE customer_id =10;

根據(jù)唯一索引unique index進行的查詢:

EXPLAIN SELECT * FROM customer WHERE email ='MARY.SMITH@sakilacustomer.org';

7、type=NULL,MySQL不用訪問表或者索引,直接就能夠得到結(jié)果

.possible_keys: 表示查詢可能使用的索引

.key: 實際使用的索引

.key_len: 使用索引字段的長度

.ref: 使用哪個列或常數(shù)與key一起從表中選擇行。

.rows: 掃描行的數(shù)量

.filtered: 存儲引擎返回的數(shù)據(jù)在server層過濾后,剩下多少滿足查詢的記錄數(shù)量的比例(百分比)

.Extra: 執(zhí)行情況的說明和描述,包含不適合在其他列中顯示但是對執(zhí)行計劃非常重要的額外信息

最主要的有一下三種:


Using Index 表示索引覆蓋,不會回表查詢
Using Where 表示進行了回表查詢
Using Index Condition 表示進行了ICP優(yōu)化
Using Flesort 表示MySQL需額外排序操作, 不能通過索引順序達到排序效果

什么是ICP?

MySQL5.6引入了Index Condition Pushdown(ICP)的特性,進一步優(yōu)化了查詢。Pushdown表示操作下放,某些情況下的條件過濾操作下放到存儲引擎。

EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;

在5.6版本之前:

優(yōu)化器首先使用復(fù)合索引idx_rental_date過濾出符合條件rental_date='2005-05-25'的記錄,然后根據(jù)復(fù)合索引idx_rental_date回表獲取記錄,最終根據(jù)條件customer_id>=300 AND customer_id<=400過濾出最后的查詢結(jié)果(在服務(wù)層完成)。

在5.6版本之后:

MySQL使用了ICP來進一步優(yōu)化查詢,在檢索的時候,把條件customer_id>=300 AND customer_id<=400也推到存儲引擎層完成過濾,這樣能夠降低不必要的IO訪問。Extra為Using index condition就表示使用了ICP優(yōu)化。

參考

《深入淺出MySQL》

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • MySQL讀寫分離服務(wù)配置方式

    MySQL讀寫分離服務(wù)配置方式

    通過Mycat代理實現(xiàn)MySQL的讀寫分離涉及準(zhǔn)備工作、配置文件修改、權(quán)限設(shè)置、啟動方式選擇等關(guān)鍵步驟,首先,安裝JDK1.8并配置環(huán)境變量;接著,對Mycat的server.xml和schema.xml進行配置,特別是schema.xml中對數(shù)據(jù)庫的配置需關(guān)注
    2024-11-11
  • mysql數(shù)據(jù)庫實現(xiàn)設(shè)置字段長度

    mysql數(shù)據(jù)庫實現(xiàn)設(shè)置字段長度

    這篇文章主要介紹了mysql數(shù)據(jù)庫實現(xiàn)設(shè)置字段長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 關(guān)于MySQL查詢語句的優(yōu)化詳解

    關(guān)于MySQL查詢語句的優(yōu)化詳解

    這篇文章主要介紹了MySQL查詢語句的優(yōu)化方法,分別介紹了子查詢優(yōu)化,分頁查詢優(yōu)化以及排序查詢優(yōu)化,對學(xué)習(xí)有一定的幫助,需要的小伙伴可以參考一下
    2023-04-04
  • MySQL表字段數(shù)量限制及行大小限制詳情

    MySQL表字段數(shù)量限制及行大小限制詳情

    這篇文章主要介紹了MySQL表字段數(shù)量限制及行大小限制詳情,表的行最大的row size會限制字段數(shù)量,如果當(dāng)前row size過大就不能加字段了,更多相關(guān)需要的小伙伴可以參考下面文章詳情
    2022-07-07
  • mysql字段為NULL索引是否會失效實例詳解

    mysql字段為NULL索引是否會失效實例詳解

    有很多人對null值是否走索引感覺很疑惑,所以下面這篇文章主要給大家介紹了關(guān)于mysql字段為NULL索引是否會失效的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • MySQL中ADD?COLUMN添加多個字段的寫法實例

    MySQL中ADD?COLUMN添加多個字段的寫法實例

    這篇文章主要給大家介紹了關(guān)于MySQL中ADD?COLUMN添加多個字段的寫法實例,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • MySQL總是差八個小時該如何解決

    MySQL總是差八個小時該如何解決

    最近在用mybatis時發(fā)現(xiàn),將LocalDateTime插入到數(shù)據(jù)庫時時間少了8小時,下面這篇文章主要給大家介紹了關(guān)于MySQL總是差八個小時該如何解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • MySQL中MRR如何優(yōu)化范圍查詢

    MySQL中MRR如何優(yōu)化范圍查詢

    MySQL提供了多種優(yōu)化技術(shù)以提高查詢性能,其中,MRR(Multi-Range Read)優(yōu)化是一種重要的查詢優(yōu)化技術(shù),尤其在處理包含多個范圍條件的查詢時,能夠顯著提升查詢效率,本文給大家介紹了MySQL中MRR(多范圍讀取)如何優(yōu)化范圍查詢,需要的朋友可以參考下
    2024-10-10
  • MySQL redo日志寫入磁盤的實現(xiàn)過程

    MySQL redo日志寫入磁盤的實現(xiàn)過程

    這篇文章主要介紹了MySQL redo日志寫入磁盤的實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • MySQL中LAST_INSERT_ID()函數(shù)的實現(xiàn)

    MySQL中LAST_INSERT_ID()函數(shù)的實現(xiàn)

    本文主要介紹了MySQL中LAST_INSERT_ID()函數(shù)的作用和使用方法,LAST_INSERT_ID()函數(shù)用于返回上一次INSERT操作生成的自增ID,對于需要獲取新插入記錄的主鍵的場景非常重要,感興趣的可以了解一下
    2024-10-10

最新評論