讀懂MySQL執行計畫

2022-03-17 18:26:28 字數 3747 閱讀 2229

原文:

前言在之前的面試過程中,問到執行計畫,有很多童鞋不知道是什麼?甚至將執行計畫與執行時間認為是同乙個概念。今天我們就一起來了解一下執行計畫到底是什麼?有什麼用途?

執行計畫是什麼?

執行計畫,簡單的來說,是sql在資料庫中執行時的表現情況,通常用於sql效能分析,優化等場景。在mysql中使用 explain 關鍵字來檢視。如下所示:

1.查詢t_base_user

select * from t_base_user where name="andyqian";

2.檢視上述語句的執行計畫

explain select * from t_base_user where name="andyqian";

執行檢視上述2語句後,我們可以得出以下執行計畫

上面這個執行計畫給到的資訊是: 這是乙個簡單的sql,全表掃瞄,共掃瞄1行,using where條件在t_base_user表中篩選出記錄。發現該語句並沒有走索引,為什麼是這樣的呢?別急,我們緊接著看下一節。上面執行計畫是什麼意思呢?有什麼參考價值呢?

讀懂執行計畫

通過上面,我們知道了什麼是執行計畫,也看到了執行計畫到底是什麼東西,現在我們來具體了解一下,mysql執行計畫中,每個屬性代表的是什麼意思?

我們一一來介紹,並說明每個屬性有哪些可選值,以及每個可選值的意思。

看到這裡,我們應該已經發現,在第一步中,我們的這條sql

select * from t_base_user where name="andyqian";

是沒有走索引的,而且還是全表掃瞄,在資料量少的情況下,問題還不會特別突出,如果資料量比較大,這可是個會造成生產事故的慢查詢哦,現在我們改造一下,將name欄位新增上索引,

新增索引

alter table t_base_user add index idx_name(name);

看看它的執行計畫是怎樣的。

你看,  現在已經走idx_name索引了,其type從all(全表掃瞄)到ref(非唯一索引了),別看就只有這一點點小區別,在大資料量的時候,可是會起至關重要的作用!

資料結構

本文中演示的資料結構如下:

create table t_base_user(

oid bigint(20) not null primary key auto_increment,

name varchar(30) null comment "name",

email varchar(30) null comment "email",

age int null comment "age",

telephone varchar(30) null comment "telephone",

status tinyint(4) null comment "0 無效 1 有效",

created_at datetime null comment "",

updated_at datetime null comment ""

)// 新增記錄:

insert

into t_base_user (name,email,age,telephone,created_at,updated_at)

values ("andyqian","andytohome",20,"15608411",now(),now();)

乙個好的資料庫表設計,從一開始就應該考慮新增索引,而不是到最後發現慢sql了,影響業務了,才來補救。其實我在工作經歷當中,由於新建表,或新加字段後,忘記新增索引也造成了多次生產事故,記憶猶新!!!

原文:前言在之前的面試過程中,問到執行計畫,有很多童鞋不知道是什麼?甚至將執行計畫與執行時間認為是同乙個概念。今天我們就一起來了解一下執行計畫到底是什麼?有什麼用途?

執行計畫是什麼?

執行計畫,簡單的來說,是sql在資料庫中執行時的表現情況,通常用於sql效能分析,優化等場景。在mysql中使用 explain 關鍵字來檢視。如下所示:

1.查詢t_base_user

select * from t_base_user where name="andyqian";

2.檢視上述語句的執行計畫

explain select * from t_base_user where name="andyqian";

執行檢視上述2語句後,我們可以得出以下執行計畫

上面這個執行計畫給到的資訊是: 這是乙個簡單的sql,全表掃瞄,共掃瞄1行,using where條件在t_base_user表中篩選出記錄。發現該語句並沒有走索引,為什麼是這樣的呢?別急,我們緊接著看下一節。上面執行計畫是什麼意思呢?有什麼參考價值呢?

讀懂執行計畫

通過上面,我們知道了什麼是執行計畫,也看到了執行計畫到底是什麼東西,現在我們來具體了解一下,mysql執行計畫中,每個屬性代表的是什麼意思?

我們一一來介紹,並說明每個屬性有哪些可選值,以及每個可選值的意思。

看到這裡,我們應該已經發現,在第一步中,我們的這條sql

select * from t_base_user where name="andyqian";

是沒有走索引的,而且還是全表掃瞄,在資料量少的情況下,問題還不會特別突出,如果資料量比較大,這可是個會造成生產事故的慢查詢哦,現在我們改造一下,將name欄位新增上索引,

新增索引

alter table t_base_user add index idx_name(name);

看看它的執行計畫是怎樣的。

你看,  現在已經走idx_name索引了,其type從all(全表掃瞄)到ref(非唯一索引了),別看就只有這一點點小區別,在大資料量的時候,可是會起至關重要的作用!

資料結構

本文中演示的資料結構如下:

create table t_base_user(

oid bigint(20) not null primary key auto_increment,

name varchar(30) null comment "name",

email varchar(30) null comment "email",

age int null comment "age",

telephone varchar(30) null comment "telephone",

status tinyint(4) null comment "0 無效 1 有效",

created_at datetime null comment "",

updated_at datetime null comment ""

)// 新增記錄:

insert

into t_base_user (name,email,age,telephone,created_at,updated_at)

values ("andyqian","andytohome",20,"15608411",now(),now();)

乙個好的資料庫表設計,從一開始就應該考慮新增索引,而不是到最後發現慢sql了,影響業務了,才來補救。其實我在工作經歷當中,由於新建表,或新加字段後,忘記新增索引也造成了多次生產事故,記憶猶新!!!

6 讀懂mysql執行計畫

2.執行計畫包含的資訊 我們都知道mysql對於一條sql在執行過程中會對它進行優化,而對於查詢語句的來說最好的優化方案就是使用索引。而執行計畫就是顯示mysql執行sql時的詳細執 況。其中包含了是否使用索引,使用了那些索引 create table user id bigint 20 not n...

如何讀懂執行計畫

1 執行計畫概念 乙個執行計畫描述了一段sql語句建議的執行方法,該 計畫顯示oracle資料庫的執行sql時步驟的組合。每一步都得到資料庫中的物理資料行戒準備為他們的 使用者發布的宣告 2 生成執行計畫 使用語句生成 explain plan forselect from ods employe ...

mysql執行計畫 MySQL 執行計畫

1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....