濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > mysql索引覆蓋實(shí)例分析

mysql索引覆蓋實(shí)例分析

熱門標(biāo)簽:400電話申請(qǐng)廠家現(xiàn)貨 百度地圖標(biāo)注要什么軟件 中國(guó)地圖標(biāo)注公司 昌德訊外呼系統(tǒng) 徐涇鎮(zhèn)騰訊地圖標(biāo)注 福建外呼電銷機(jī)器人加盟 天津公司外呼系統(tǒng)軟件 自己做地圖標(biāo)注需要些什么 電話機(jī)器人的價(jià)格多少錢一個(gè)月

本文實(shí)例講述了mysql索引覆蓋。分享給大家供大家參考,具體如下:

索引覆蓋

如果查詢的列恰好是索引的一部分,那么查詢只需要在索引文件上進(jìn)行,不需要回行到磁盤再找數(shù)據(jù)。這種查詢速度非常快,稱為“索引覆蓋”。

假設(shè)有一張t15表,在表中建立了一個(gè)聯(lián)合索引:cp(cat_id,price)

當(dāng)我們使用下面的sql語(yǔ)句,會(huì)出現(xiàn)索引覆蓋的情況。不信我們可以來(lái)查看一下,這里的Extra中顯示了Using index,表示這條sql語(yǔ)句剛好用到了索引覆蓋。

select price from t15 where cat_id = 1;

在來(lái)看一題,創(chuàng)建一張t11表,在email列有一個(gè)索引

假設(shè)我們用這樣的查詢語(yǔ)句:

select eamil from  t11 where right(email,4)='.com'

查詢分析:

首先看一下Extra,這里有Using index,說(shuō)明這里使用到了索引覆蓋,而possible_keys為NULL的原因是因?yàn)?,使用到了mysql中的函數(shù),所以在查詢的時(shí)候并沒(méi)有使用到email索引,但是key卻為email,表示了使用到了索引進(jìn)行排序,不信我把數(shù)據(jù)打印看看。

這里的數(shù)據(jù)是經(jīng)過(guò)排序的。原本的數(shù)據(jù)是這樣的。

索引覆蓋的問(wèn)題

create table A (
id varchar(64) primary key,
ver int,
…
)

表中有幾個(gè)很長(zhǎng)的字段varbinary(3000) ,在id、ver上有聯(lián)合索引 ,共10000條數(shù)據(jù)

為什么select id from A order by id特別慢?
select id from A order by id,ver非???/p>

疑問(wèn): id, (id,ver)都有索引, select id 應(yīng)該都產(chǎn)生”索引覆蓋”的效果,為什么前者慢,而后快?

思路:innodb聚簇與myisam索引的不同 , 索引覆蓋 這2個(gè)角度來(lái)考慮

(1)假設(shè)此表使用的是Myisam的索引,那么這兩條sql語(yǔ)句都不需要回行查找數(shù)據(jù),那么他們的速度應(yīng)該差不多。

(2)假設(shè)此表使用的是InnoDB的索引,那么select id from A order by id這句sql使用到了主鍵索引,因?yàn)镮nnoDB的每個(gè)主鍵都掛載這每行的數(shù)據(jù),并且本題中還有幾個(gè)特別大的字段,所以會(huì)在查找id的時(shí)候需要走的相對(duì)慢;而select id from A order by id,ver這句sql使用到了id,ver聯(lián)合索引,在InnoDB存儲(chǔ)引擎中,次索引保存的是對(duì)主鍵索引的應(yīng)用,所以次索引不掛載該行的數(shù)據(jù),那么在(id,ver)索引中查找id會(huì)快,當(dāng)找到對(duì)應(yīng)的節(jié)點(diǎn)樹(shù)時(shí),只需要再次查找到主鍵索引的位置,即可拿到該行的數(shù)據(jù),這樣比較快。

推斷:

(1)表如果是myisam引擎,2個(gè)語(yǔ)句,速度不會(huì)有明顯差異.
(2)innodb表因?yàn)榫鄞厮饕?id索引要在磁盤上跨N多塊,導(dǎo)致速度慢.
(3)即使innodb引擎,如果沒(méi)有那幾個(gè)varbinay長(zhǎng)列, 2個(gè)語(yǔ)句的速度也不會(huì)有明顯差異.

t12表,存儲(chǔ)引擎為MyISAM,有主鍵索引和(id,ver)符合索引,還有幾個(gè)大的變長(zhǎng)字段,測(cè)試推論1

t13表,存儲(chǔ)引擎為InnoDB,有主鍵索引和(id,ver)符合索引,還有幾個(gè)大的變長(zhǎng)字段推論2

t14表,存儲(chǔ)引擎為InnoDB,有主鍵索引和(id,ver)符合索引,沒(méi)有幾個(gè)大的變長(zhǎng)字段推論3

t12,t13,t14每張表中都有1W條數(shù)據(jù),然后進(jìn)行測(cè)試,測(cè)試結(jié)果如下,我們的推論是正確的。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》及《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》

希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。

您可能感興趣的文章:
  • MySQL 的覆蓋索引與回表的使用方法
  • mysql利用覆蓋索引避免回表優(yōu)化查詢
  • mysql回表致索引失效案例講解
  • MySQL中的回表和索引覆蓋示例詳解

標(biāo)簽:黔西 駐馬店 荊門 梅河口 北京 陜西 昌都 鄂爾多斯

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql索引覆蓋實(shí)例分析》,本文關(guān)鍵詞  mysql,索引,覆蓋,實(shí)例分析,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql索引覆蓋實(shí)例分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于mysql索引覆蓋實(shí)例分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    昌黎县| 浦江县| 乃东县| 渑池县| 抚松县| 惠东县| 中山市| 佛坪县| 柏乡县| 木兰县| 肥乡县| 蒙城县| 开平市| 吴旗县| 彭水| 庆阳市| 东乌| 云和县| 贵溪市| 聊城市| 阿勒泰市| 二手房| 壤塘县| 滦平县| 贡山| 师宗县| 孟津县| 开平市| 龙江县| 四子王旗| 都昌县| 林西县| 霍城县| 清丰县| 嘉祥县| 仁怀市| 布尔津县| 赞皇县| 连州市| 南康市| 开封市|