日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
MySQL性能調(diào)優(yōu),應(yīng)該掌握這一個(gè)工具?。?!

作者:KG沈劍?

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括邢臺(tái)縣網(wǎng)站建設(shè)、邢臺(tái)縣網(wǎng)站制作、邢臺(tái)縣網(wǎng)頁(yè)制作以及邢臺(tái)縣網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邢臺(tái)縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邢臺(tái)縣省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

《??數(shù)據(jù)庫(kù)允許空值(null),往往是悲劇的開始???》一文通過explain來分析SQL的執(zhí)行計(jì)劃,來分析null對(duì)索引命中情況的影響。

explain是MySQL性能調(diào)優(yōu)過程中必須掌握的工具,今天花1分鐘簡(jiǎn)單說下,explain結(jié)果中常見的type結(jié)果及代表的含義,并且通過同一個(gè)SQL語句的性能差異,說明建立正確的索引多么重要。

explain結(jié)果中的type字段代表什么意思??

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

最為常見的掃描方式有:

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

畫外音:這些是最常見的,大家去explain自己工作中的SQL語句,95%都是上面這些類型。?

上面各類掃描方式由快到慢:

system > const > eq_ref > ref > range > index > ALL?

下面一一舉例說明。

一、system?

explain select * from mysql.time_zone;

上例中,從系統(tǒng)庫(kù)mysql的系統(tǒng)表time_zone里查詢數(shù)據(jù),掃碼類型為system,這些數(shù)據(jù)已經(jīng)加載到內(nèi)存里,不需要進(jìn)行磁盤IO。

這類掃描是速度最快的。

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

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

二、const?

數(shù)據(jù)準(zhǔn)備:

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掃描的條件為:

  • 命中主鍵(primary key)或者唯一(unique)索引;
  • 被連接的部分是一個(gè)常量(const)值;
explain select * from user where id=1;

如上例,id是PK,連接部分是常量1。

畫外音:這里注意,防止隱式類型轉(zhuǎn)換。

這類掃描效率極高,返回?cái)?shù)據(jù)量少,速度非??臁?/p>

三、eq_ref?

數(shù)據(jù)準(zhǔn)備:

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掃描的條件為,對(duì)于前表的每一行(row),后表只有一行被掃描。

再細(xì)化一點(diǎn):

  • join查詢;
  • 命中主鍵(primary key)或者非空唯一(unique not null)索引;
  • 等值連接;
explain select * from user,user_ex 
where user.id=user_ex.id;

如上例,id是主鍵,該join查詢?yōu)閑q_ref掃描。

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

四、ref?

數(shù)據(jù)準(zhǔn)備:

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降級(jí)為了ref,此時(shí)對(duì)于前表的每一行(row),后表可能有多于一行的數(shù)據(jù)被掃描。

explain select * from user where id=1;

當(dāng)id改為普通非唯一索引后,常量的連接查詢,也由const降級(jí)為了ref,因?yàn)橐部赡苡卸嘤谝恍械臄?shù)據(jù)被掃描。

ref掃描,可能出現(xiàn)在join里,也可能出現(xiàn)在單表普通索引里,每一次匹配可能有多行數(shù)據(jù)返回,雖然它比eq_ref要慢,但它仍然是一個(gè)很快的join類型。

五、range?

數(shù)據(jù)準(zhǔn)備:

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掃描就比較好理解了,它是索引上的范圍查詢,它會(huì)在索引上掃描特定范圍內(nèi)的值。

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類型,需要掃描索引上的全部數(shù)據(jù)。

explain count (*) from user;

如上例,id是主鍵,該count查詢需要通過掃描索引上的全部數(shù)據(jù)來計(jì)數(shù)。

畫外音:此表為InnoDB引擎。

它僅比全表掃描快一點(diǎn)。

七、ALL?

數(shù)據(jù)準(zhǔn)備:

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上不建索引,對(duì)于前表的每一行(row),后表都要被全表掃描。

今天這篇文章中,這個(gè)相同的join語句出現(xiàn)了三次:

  • 掃描類型為eq_ref,此時(shí)id為主鍵;
  • 掃描類型為ref,此時(shí)id為非唯一普通索引;
  • 掃描類型為ALL,全表掃描,此時(shí)id上無索引;

由此可見,建立正確的索引,對(duì)數(shù)據(jù)庫(kù)性能的提升是多么重要。

全表掃描代價(jià)極大,性能很低,是應(yīng)當(dāng)極力避免的,通過explain分析SQL語句,非常有必要。

總結(jié)?

(1) explain結(jié)果中的type字段,表示(廣義)連接類型,它描述了找到所需數(shù)據(jù)使用的掃描方式;

(2) 常見的掃描類型有:

system>const>eq_ref>ref>range>index>ALL

其掃描速度由快到慢;

(3)  各類掃描類型的要點(diǎn)是:

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

(4)建立正確的索引(index),非常重要;

(5)使用explain了解并優(yōu)化執(zhí)行計(jì)劃,非常重要;

思路比結(jié)論重要,希望大家有收獲。

畫外音:本文測(cè)試于MySQL5.6。?


文章題目:MySQL性能調(diào)優(yōu),應(yīng)該掌握這一個(gè)工具!??!
網(wǎng)頁(yè)網(wǎng)址:http://m.5511xx.com/article/dppedgc.html