中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

原文: https://www.enmotech.com/web/detail/1/767/1.html 

成都創新互聯公司主要從事成都網站設計、成都網站制作、網頁設計、企業做網站、公司建網站等業務。立足成都服務大峪,十載網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18982081108

文章轉載自公眾號  架構師之路 架構師之路 , 作者 58沈劍

導讀:本文和大家說明常見的type結果及代表的含義,并且通過同一個SQL語句的性能差異,說明建對索引多么重要。

 
explain結果中的type字段代表什么意思?

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

MySQL的官網解釋非常簡潔,只用了3個單詞:連接類型(the join type)。它描述了找到所需數據使用的掃描方式。

最為常見的掃描方式有:

  • system:系統表,少量數據,往往不需要進行磁盤IO;
  • const:常量連接;
  • eq_ref:主鍵索引(primary key)或者非空唯一索引(unique not null)等值掃描;
  • ref:非主鍵非唯一索引等值掃描;
  • range:范圍掃描;
  • index:索引樹掃描;
  • ALL:全表掃描(full table scan);

畫外音: 這些是最常見的,大家去explain自己工作中的SQL語句,95%都是上面這些類型。
 
上面各類掃描方式由快到慢:
system > const > eq_ref > ref > range > index > ALL

下面一一舉例說明。

一、system


一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

explai select * from mysql.time_zone;

上例中,從系統庫mysql的系統表time_zone里查詢數據,掃碼類型為system,這些數據已經加載到內存里,不需要進行磁盤IO。

這類掃描是速度最快的。

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”


explain select * from (select * from user where id=1) tmp;

再舉一個例子,內層嵌套(const)返回了一個臨時表,外層嵌套從臨時表查詢,其掃描類型也是system,也不需要走磁盤IO,速度超快。

二、const


數據準備:

create table user (
id int primary key,
name varchar(20)
)engine=innodb;
 
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

const掃描的條件為:
(1)命中主鍵(primary key)或者唯一(unique)索引;
(2)被連接的部分是一個常量(const)值;
 
explain select * from user where id=1;
如上例,id是PK,連接部分是常量1。
畫外音:別搞什么類型轉換的幺蛾子。
 
這類掃描效率極高,返回數據量少,速度非常快。

三、eq_ref


數據準備:

create table user (
id int primary key,
name varchar(20)
)engine=innodb;
 
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
 
create table user_ex (
id int primary key,
age int
)engine=innodb;
 
insert into user_ex values(1,18);
insert into user_ex values(2,20);
insert into user_ex values(3,30);
insert into user_ex values(4,40);
insert into user_ex values(5,50);

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

eq_ref掃描的條件為,對于前表的每一行(row),后表只有一行被掃描。
 
再細化一點:
(1)join查詢;
(2)命中主鍵(primary key)或者非空唯一(unique not null)索引;
(3)等值連接;

explain select * from user,user_ex where user.id=user_ex.id;

如上例,id是主鍵,該join查詢為eq_ref掃描。

這類掃描的速度也異常之快。

四、ref


數據準備:

create table user (
id int,
name varchar(20) ,
index(id)
)engine=innodb;
 
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
 
create table user_ex (
id int,
age int,
index(id)
)engine=innodb;
 
insert into user_ex values(1,18);
insert into user_ex values(2,20);
insert into user_ex values(3,30);
insert into user_ex values(4,40);
insert into user_ex values(5,50);

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

如果把上例eq_ref案例中的主鍵索引,改為普通非唯一(non unique)索引。

explain select * from user,user_ex where user.id=user_ex.id;

就由eq_ref降級為了ref,此時對于前表的每一行(row),后表可能有多于一行的數據被掃描。

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

explain select * from user where id=1;

當id改為普通非唯一索引后,常量的連接查詢,也由const降級為了ref,因為也可能有多于一行的數據被掃描。
 
ref掃描,可能出現在join里,也可能出現在單表普通索引里,每一次匹配可能有多行數據返回,雖然它比eq_ref要慢,但它仍然是一個很快的join類型。

五、range


數據準備:

create table user (
id int primary key,
name varchar(20)
)engine=innodb;
 
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”


range掃描就比較好理解了,它是索引上的范圍查詢,它會在索引上掃碼特定范圍內的值。

explain select * from user where id between 1 and 4;
explain select * from user where idin(1,2,3);
explain select * from user where id>3;

像上例中的between,in,>都是典型的范圍(range)查詢。
畫外音:必須是索引,否則不能批量"跳過"。

六、index


一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

index類型,需要掃描索引上的全部數據。

explain count (*) from user;

如上例,id是主鍵,該count查詢需要通過掃描索引上的全部數據來計數。
畫外音:此表為InnoDB引擎。
 
它僅比全表掃描快一點。

七、ALL


數據準備:

create table user (
id int,
name varchar(20)
)engine=innodb;
 
insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
 
create table user_ex (
id int,
age int
)engine=innodb;
 
insert into user_ex values(1,18);
insert into user_ex values(2,20);
insert into user_ex values(3,30);
insert into user_ex values(4,40);
insert into user_ex values(5,50);

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

explain select * from user,user_ex where user.id=user_ex.id;

如果id上不建索引,對于前表的每一行(row),后表都要被全表掃描。

今天這篇文章中,這個相同的join語句出現了三次:
(1)掃描類型為eq_ref,此時id為主鍵;
(2)掃描類型為ref,此時id為非唯一普通索引;
(3)掃描類型為ALL,全表掃描,此時id上無索引;
 
有此可見,建立正確的索引,對數據庫性能的提升是多么重要。
 
另外,不正確的SQL語句,可能導致全表掃描。
 
全表掃描代價極大,性能很低,是應當極力避免的,通過explain分析SQL語句,非常有必要。

總結


(1)explain結果中的type字段,表示(廣義)連接類型,它描述了找到所需數據使用的掃描方式;
(2)常見的掃描類型有:
system>const>eq_ref>ref>range>index>ALL
其掃描速度由快到慢;
(3)各類掃描類型的要點是:

  • system最快:不進行磁盤IO
  • const:PK或者unique上的等值查詢
  • eq_ref:PK或者unique上的join查詢,等值匹配,對于前表的每一行(row),后表只有一行命中
  • ref:非唯一索引,等值匹配,可能有多行命中
  • range:索引上的范圍掃描,例如:between/in/>
  • index:索引上的全集掃描,例如:InnoDB的count
  • ALL最慢:全表掃描(full table scan)

(4)建立正確的索引(index),非常重要;
(5)使用explain了解并優化執行計劃,非常重要;
 
思路比結論重要,希望大家有收獲。

畫外音:本文測試于MySQL5.6。

出處:架構師之路(ID:road5858)

想了解更多關于數據庫、云技術的內容嗎?

快來關注“數據和云”公眾號、“云和恩墨”官方網站,我們期待與大家一同學習和進步!

一文讀懂“建立正確的索引,對數據庫性能提升的重要性”

(掃描上方二維碼,關注“數據和云”公眾號,即可查看更多科技文章)

當前題目:一文讀懂“建立正確的索引,對數據庫性能提升的重要性”
轉載來于:http://m.2m8n56k.cn/article16/jdchdg.html

成都網站建設公司_創新互聯,為您提供軟件開發搜索引擎優化做網站品牌網站設計網站設計小程序開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 欧美美女网站 | 国产精品人成人免费国产 | 亚洲国产午夜精品理论片的软件 | 国产欧美一区二区精品久久久 | 国产一级毛片卡 | 成人夜色视频网站在线观看 | 国产 高清 在线 | 成人区精品一区二区不卡亚洲 | 无国产精品白浆是免费 | 欧美成人性色大片在线观看 | 亚洲精品在线免费观看视频 | 91小视频在线观看免费版高清 | 不卡一区在线观看 | 国产精品久久久久久久网站 | 一级黄网站| 日韩视频一区二区三区 | 步兵一区二区三区在线观看 | 日本三级香港三级乳网址 | 热re66久久精品国产99热 | 国内高清自拍 | 中国农村一级毛片 | 91精品国产91热久久久久福利 | 欧美aaaa在线观看视频免费 | 国产一级视频在线 | 亚洲免费一 | 国产亚洲精品资源一区 | 国产在线a | 国内精品七七久久影院 | 亚洲欧美一区二区三区久久 | 免费视频日本 | 国产精品国产三级国产专播 | 国产精品爽爽va在线观看无码 | 成年免费观看 | 最全精品自拍视频在线 | 九色福利 | 成人三级视频在线观看 | 91国高清视频| 免费特黄视频 | 欧美三级一级片 | 亚洲高清国产一区二区三区 | 精品国产一区在线观看 |