執行計畫,簡單的來說,是sql在資料庫中執行時的表現情況,通常用於sql效能分析,優化等場景。在mysql使用explain關鍵字來檢視sql的執行計畫。如下所示:
//1. 查詢t_base_user
select * from t_base_user where name="andyqian";
//2. 檢視上述語句的執行計畫
explain select * from t_base_user where name="andyqian";
執行檢視上述2語句後,我們可以得出以下執行計畫結果
idselect_type
table
type
possible_kes
keykey_len
refrows
extra
1******
t_base_user
all1
using where
上面執行計畫是什麼意思呢?有什麼參考價值呢?
上面這個執行計畫給到的資訊是: 這個結果通過乙個簡單的語句全表掃瞄,共掃瞄1行,使用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);
看看它的執行計畫是怎樣的。
idselect_type
table
type
possible_kes
keykey_len
refrows
extra
1******
t_base_user
refidx_name
idx_name
93cons
1using where
你看,現在已經走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","[email protected]",20,"15608411",now(),now());
乙個好的資料庫表設計,從一開始就應該考慮新增索引,而不是到最後發現慢sql了,影響業務了,才來補救。其實我在工作經歷當中,由於新建表,或新加字段後,忘記新增索引也造成了多次生產事故,記憶猶新!!!
mysql 執行計畫詳解
1 id列數字越大越先執行,如果說數字一樣大,那麼就從上往下依次執行,id列為null的就表是這是乙個結果集,不需要使用它來進行查詢。2 select type列常見的有 a 表示不需要union操作或者不包含子查詢的簡單select查詢。有連線查詢時,外層的查詢為 且只有乙個 b primary ...
mysql執行計畫詳解
引言 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃瞄表 怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千萬 億的時候,我們運 行同樣的...
MySQL執行計畫詳解
在進行sql優化的時候我們常常使用explain來檢視執行計畫,這裡來詳細解釋一下執行計畫的字段意義 表示select語句的順序,id值大的先執行,id相同則從上到下執行 這一列顯示了 對應行是簡單還是複雜select,值意味著查詢不包括子查詢和union。查詢有任何複雜的子部分,則最外層標記為pr...