最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

下面分別對(duì)EXPLAIN命令結(jié)果的每一列進(jìn)行說(shuō)明:

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


類型 說(shuō)明
SIMPLE 簡(jiǎn)單表,不使用表連接或子查詢
PRIMARY 主查詢,即外層的查詢
UNION UNION中的第二個(gè)或者后面的查詢語(yǔ)句
SUBQUERY 子查詢中的第一個(gè)

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

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


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

1、type=ALL,全表掃描,MySQL遍歷全表來(lái)找到匹配行

一般是沒(méi)有where條件或者where條件沒(méi)有使用索引的查詢語(yǔ)句

EXPLAIN SELECT * FROM customer WHERE active=0;

2、type=index,索引全掃描,MySQL遍歷整個(gè)索引來(lái)查詢匹配行,并不會(huì)掃描表

一般是查詢的字段都有索引的查詢語(yǔ)句

EXPLAIN SELECT store_id FROM customer;

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

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

注意這種情況下比較的字段是需要加索引的,如果沒(méi)有索引,則MySQL會(huì)進(jìn)行全表掃描,如下面這種情況,create_date字段沒(méi)有加索引:

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

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

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

EXPLAIN SELECT * FROM customer WHERE store_id=10;

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

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

因?yàn)閏ustomer、payment兩表中customer表的記錄行數(shù)最少,所以customer表進(jìn)行全表掃描,payment表通過(guò)非唯一索引尋找匹配行。

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

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

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

film、film_text表關(guān)聯(lián)查詢和上一條所說(shuō)的基本一致,只不過(guò)關(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,單表中最多有一條匹配行,查詢起來(lái)非常迅速,所以這個(gè)匹配行的其他列的值可以被優(yōu)化器在當(dāng)前查詢中當(dāng)作常量來(lái)處理

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

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

EXPLAIN SELECT * FROM customer WHERE customer_id =10;

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

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

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

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

.key: 實(shí)際使用的索引

.key_len: 使用索引字段的長(zhǎng)度

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

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

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

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

最主要的有一下三種:


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

什么是ICP?

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

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過(guò)濾出符合條件rental_date='2005-05-25'的記錄,然后根據(jù)復(fù)合索引idx_rental_date回表獲取記錄,最終根據(jù)條件customer_id>=300 AND customer_id<=400過(guò)濾出最后的查詢結(jié)果(在服務(wù)層完成)。

在5.6版本之后:

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

參考

《深入淺出MySQL》

總結(jié)

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

相關(guān)文章

  • percona 實(shí)用工具之pt-kill使用介紹

    percona 實(shí)用工具之pt-kill使用介紹

    一個(gè)優(yōu)秀的kill MySQL連接的一個(gè)工具,是percona toolkit的一部分,在因?yàn)榭臻e連接較多導(dǎo)致超過(guò)最大連接數(shù)、某個(gè)有問(wèn)題的sql導(dǎo)致mysql負(fù)載很高時(shí),都需要將一些連接kill掉,這個(gè)工具主要就是這個(gè)用途
    2016-04-04
  • mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例

    mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySQL執(zhí)行SQL文件報(bào)錯(cuò):Unknown collation ‘utf8mb4_0900_ai_ci‘的解決方案

    MySQL執(zhí)行SQL文件報(bào)錯(cuò):Unknown collation ‘utf8mb4_0900_ai_

    這篇文章主要給大家分享了MySQL執(zhí)行SQL文件出現(xiàn)【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解決方案,如果又遇到相同問(wèn)題的同學(xué),可以參考閱讀本文
    2023-09-09
  • Mysql大表修改字段兩種解決方式

    Mysql大表修改字段兩種解決方式

    這篇文章主要給大家介紹了關(guān)于Mysql大表修改字段的兩種解決方式,文中介紹了在處理平臺(tái)幣訂單表字段類型修改時(shí)遇到的問(wèn)題及解決方案,需要的朋友可以參考下
    2024-11-11
  • MySQL執(zhí)行事務(wù)的語(yǔ)法與流程詳解

    MySQL執(zhí)行事務(wù)的語(yǔ)法與流程詳解

    這篇文章主要介紹了MySQL執(zhí)行事務(wù)的語(yǔ)法與流程的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法分析

    mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法分析

    這篇文章主要介紹了mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過(guò)存儲(chǔ)過(guò)程新增字段相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • Mysql審核查詢平臺(tái)Archery部署過(guò)程

    Mysql審核查詢平臺(tái)Archery部署過(guò)程

    Archery是一個(gè)開源的SQL審核查詢平臺(tái),旨在提升DBA的工作效率,它支持多數(shù)據(jù)庫(kù)的SQL上線和查詢,并且所有功能都兼容手機(jī)端操作,以下是基于Docker搭建Archery2.1系統(tǒng)環(huán)境的步驟,包括配置、安裝、啟動(dòng)等
    2025-02-02
  • MySQL 存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)分析

    MySQL 存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)分析

    存儲(chǔ)過(guò)程(Stored Procedure)是一種在數(shù)據(jù)庫(kù)中存儲(chǔ)復(fù)雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫(kù)對(duì)象。本文將分析存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)
    2021-05-05
  • MySQL 8.0.15配置MGR單主多從的方法

    MySQL 8.0.15配置MGR單主多從的方法

    這篇文章主要介紹了MySQL 8.0.15配置MGR單主多從的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL如何恢復(fù)單庫(kù)或單表,以及可能遇到的坑

    MySQL如何恢復(fù)單庫(kù)或單表,以及可能遇到的坑

    這篇文章主要介紹了MySQL如何恢復(fù)單庫(kù)或單表,以及可能遇到的坑,幫助大家更好的備份數(shù)據(jù)庫(kù),保護(hù)數(shù)據(jù)安全,感興趣的朋友可以了解下
    2020-09-09

最新評(píng)論

绥芬河市| 宁德市| 秦安县| 隆德县| 温宿县| 武穴市| 塔河县| 博爱县| 萨嘎县| 高密市| 桃园市| 阿坝| 抚远县| 建阳市| 德江县| 鄂温| 湖州市| 陈巴尔虎旗| 玉门市| 临泽县| 宜春市| 靖远县| 冕宁县| 新干县| 达孜县| 陵川县| 新宁县| 遂宁市| 唐山市| 汽车| 南平市| 米易县| 武功县| 古交市| 元阳县| 遵义市| 十堰市| 绍兴市| 牡丹江市| 潼关县| 仁化县|