1. 程式人生 > >【mysql 執行計劃】讀懂mysql 中的執行計劃

【mysql 執行計劃】讀懂mysql 中的執行計劃

一、什麼是mysql執行計劃?

執行計劃,簡單的來說,是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";

這裡寫圖片描述

上面執行計劃是什麼意思呢?有什麼參考價值呢?

上面這個執行計劃給到的資訊是: 這個結果通過一個簡單的語句全表掃描,共掃描1行,使用where條件在t_base_user表中篩選出的。發現該語句並沒有走索引,為什麼是這樣的呢?別急,繼續往下看。

二、如何讀懂執行計劃
通過上面,我們知道了什麼是執行計劃,也看到了執行計劃到底是什麼東西,現在我們來具體瞭解一下,MySQL執行計劃中,每個屬性代表的是什麼意思?

id

表示查詢中select操作表的順序,按順序從大到小依次執行
select_type :
該表示選擇的型別,可選值有: SIMPLE(簡單的),
type :
該屬性表示訪問型別,有很多種訪問型別。
最常見的其中包括以下幾種: ALL(全表掃描), index(索引掃描),range(範圍掃描),ref (非唯一索引掃描),eq_ref(唯一索引掃描,),(const)常數引用, 訪問速度依次由慢到快。其中 : range(範圍)常見與 between and …, 大於 and 小於這種情況。
提示 : 慢SQL是否走索引,走了什麼索引,也就可以通過該屬性查看了


table :
表示該語句查詢的表
possible_keys :
顧名思義,該屬性給出了,該查詢語句,可能走的索引,(如某些欄位上索引的名字)這裡提供的只是參考,而不是實際走的索引,也就導致會有possible_Keys不為null,key為空的現象。
key :
顯示MySQL實際使用的索引,其中就包括主鍵索引(PRIMARY),或者自建索引的名字。
key_len :
表示索引所使用的位元組數,
ref :
連線匹配條件,如果走主鍵索引的話,該值為: const, 全表掃描的話,為null值
rows :
掃描行數,也就是說,需要掃描多少行,採能獲取目標行數,一般情況下會大於返回行數。通常情況下,rows越小,效率越高, 也就有大部分SQL優化,都是在減少這個值的大小
。注意: 理想情況下掃描的行數與實際返回行數理論上是一致的,但這種情況及其少,如關聯查詢,掃描的行數就會比返回行數大大增加)
Extra
這個屬性非常重要,該屬性中包括執行SQL時的真實情況資訊,如上面所屬,使用到的是”using where”,表示使用where篩選得到的值,常用的有:
“Using temporary”: 使用臨時表 “using filesort”: 使用檔案排序
看到這裡,我們應該已經發現,在第一步中,我們的這條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(非唯一索引了),別看就只有這一點點小區別,在大資料量的時候,可是會起大作用的哦。

sql語句:

# 建立表  

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 執行計劃mysql 執行計劃

一、什麼是mysql執行計劃? 執行計劃,簡單的來說,是SQL在資料庫中執行時的表現情況,通常用於SQL效能分析,優化等場景。在MySQL使用 explain 關鍵字來檢視SQL的執行計劃。如下所示: //1. 查詢t_base_user select *

純幹貨Amoeba實現MySQL主從同步與寫分離

exec strong arc all abstract a star status utf prop 【純幹貨】Amoeba實現MySQL主從同步與讀寫分離 一、簡介 amoeba簡介 Amoeba(變形蟲)項目,該開源框架於2008年開始發布一款 Amoeba f

學會 MySql 的慢查詢日誌

操作 get time user net 假死 幸運 存在 報錯 在前邊的博客《何時、怎樣開啟 MySql 日誌?》中,我們了解到了怎樣啟用 MySql 的慢查詢日誌。今天我們來看一下怎樣去讀懂這些慢查詢日誌。在跟蹤慢查詢日誌之前。首先你得保證最少發生過一次慢查詢。假設

一圖mysql的update語句修改管理員密碼

一圖讀懂mysql的update語句修改對於剛學習mysql的小白(本人),經常無法正常理解mysql上面的help的意思(英文太菜),只能通過查詢中文資料來理解.下圖是我畫理解圖 ----------------------------------------------------------分割線---

使用10046檢視執行計劃trace檔案

轉自:https://blog.csdn.net/dataminer_2007/article/details/42040853 檢視 sql 執行計劃的方法有許多種, 10046 事件就是其中的一種. 與其他檢視 sql 執行計劃不同, 當我們遇到比較複雜的 sql 語句, 我們可以通過 10

2017DTC精彩重現Oracle和MySQL DBA的進階之路

分享的初衷 這個是參考了朱贇[yūn]的一段話,我覺得已經很透徹形象了,畢竟在短短的幾十分鐘裡,你只能得到一些思想上的建議和思路,落到實處還是得靠自己。而參考和借鑑的過程也是自己修行的過程。第二句我關於堅持,有的同學說堅持是習慣,有的說是毅力,本質上來說,還是堅持的態度,是堅持做一件事情,還是堅持把一件

機器學習機器學習Top10演算法,教你選擇最合適的那一個!一文ML的解析解與數值解...

在機器學習領域裡,不存在一種萬能的演算法可以完美解決所有問題,尤其是像預測建模的監督學習裡。比方

報錯總結Hive連線MySQL報錯

【報錯描述】安裝好Hive和Mysql後,要將Hive整合MySQL,但Hive始終不能連上MySQL,mysql中也沒有出現metastore資料庫,鍵入命令/bin/hive,報錯如下: [[email protected] hive-0.13.1]$ bin/hive

mysql學習第1篇:初始MySQL

mysql學習【第1篇】:初始MySQL 為什麼學習資料庫 只會寫程式碼的是碼農;學好資料庫,基本能混口飯吃;在此基礎上再學好作業系統和計算機網路,就能當一個不錯的程式設計師。如果能再把離散數學、數位電路、體系結構、資料結構/演算法、編譯原理學通透,再加上豐富的實踐經驗與領域特定知識,就能算是一個優

數據庫9.0 MySQL入門學習(九)——獲得數據庫和表的信息、日期計算、查詢

編輯 輸入 3.0 dog tro ron 學習 後來 spec 1.0 SELECT語句用來從數據表中檢索信息。 SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; what_to_s

一文MySQL複製機制

背景介紹 複製,就是對資料的完整拷貝,說到為什麼要複製,首先能想到的是怕資料意外丟失,使得使用者蒙受損失。 當完成了資料複製之後,會發現它的優勢不止這一點,假如一臺機器宕機了,可以啟用備份在另一臺機器的資料。畢竟宕機的概率很小,閒暇時間還可以讓備份機器分擔主機器的流量壓力。除此之外,當要升級資料庫版本時,可以

一文徹底MySQL事務的四大隔離級別

## 前言 之前分析一個死鎖問題,發現自己對資料庫隔離級別理解還不夠清楚,所以趁著這幾天假期,整理一下MySQL事務的四大隔離級別相關知識,希望對大家有幫助~ ![](https://user-gold-cdn.xitu.io/2020/4/5/171498a008c91b4c?w=985&h=6

一文MySQL的事務隔離級別及MVCC機制

回顧前文: [一文學會MySQL的explain工具](https://www.cnblogs.com/itwild/p/13424113.html) [一文讀懂MySQL的索引結構及查詢優化](https://www.cnblogs.com/itwild/p/13703259.html)

C#學習筆記SQL Server2008

data ext lose tar inf lec area space args using System; using System.Data.SqlClient; namespace ConsoleApplication { class Pro

C#學習筆記access2007

ole cat sys source class void sel mes nec using System; using System.Data.OleDb; namespace ConsoleApplication { class Program

墻裂推薦入優化和輸出優化

return getchar() ret style getchar 決定 推薦 int div 讀入優化: 1 inline int read() 2 { 3 int X=0,w=1; char ch=0; 4 while(ch<‘0‘ || ch

文件操作寫文本文件

一次 只讀 方式 post col 模式 all 文件 blog 【讀寫txt文件】 r:只讀 w:只寫模式【不可讀;不存在則創建;存在則清空內容】 w+:w+,寫讀【可讀,可寫】,消除文件內容,然後以讀寫方式打開文件。 #coding=utf-8 # 讀文件 def

好課推薦再不區塊鏈,你就out了!快快開啟進階之路,挑戰高薪職位吧

理念 培訓 政府 改變 全國 要素 sha 精品 下一個 區塊鏈技術被認為是繼蒸汽機、電力、互聯網之後,下一代顛覆性的核心技術。 如果說蒸汽機釋放了人們的生產力,電力解決了人們基本的生活需求,互聯網徹底改變了信息傳遞的方式,那麽區塊鏈作為構造信任的機器,將可能徹底改變整個人

Linux C/C++ 第08講 多執行緒TCP傳輸檔案/select模型

一、多執行緒    pthread.h    libpthread.so   -lpthread    1.建立多執行緒      1.1 程式碼   &nbs