最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何理解MYSQL中的type:index和Extra:Using

今天就跟大家聊聊有關(guān)如何理解MySQL中的type:index 和 Extra:Using,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)主營潮州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),潮州h5成都小程序開發(fā)搭建,潮州網(wǎng)站營銷推廣歡迎潮州等地區(qū)企業(yè)咨詢

考慮下面執(zhí)行計(jì)劃中的TYPE和Extra

| id | select_type | table  | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |

|  1 | SIMPLE      | testud | NULL       | index | NULL          | id2  | 10      | NULL |    3 |   100.00 | Using index |

type:index 不使用索引B+樹結(jié)構(gòu),只使用索引葉子結(jié)點(diǎn)鏈表結(jié)構(gòu)進(jìn)行掃描,我們知道在索引的葉子結(jié)點(diǎn)有一個(gè)葉子結(jié)點(diǎn)之間的雙向指針,
           并且葉子結(jié)點(diǎn)的數(shù)據(jù)是排序好的。他和ALL的方式類似,訪問效率并不高,其主要的應(yīng)用場景為用于避免order by使用using filesort
           也就是避免排序。他是一種訪問數(shù)據(jù)的方式,和const、ref、eq_ref等一樣
Extra:Using index  當(dāng)二級索引包含了所有的查詢需要的所有字段的時(shí)候,select查詢只需要通過索引及可以
                   獲得全部的數(shù)據(jù),那么就不需要回表了。注意這里全部數(shù)據(jù)是條件謂詞和查詢字段的全部
                   總和比如
                   select id1 from test where id2=1;
                   這個(gè)索引必須包含id1和id2,這里有種特殊的情況叫做Index Extensions在后面說明
                   它可以考慮B+樹結(jié)構(gòu)如使用type:ref也可以不考慮使用type:index
                   一般來說索引的大小要遠(yuǎn)遠(yuǎn)小于表的大小,不管從回表還是讀取物理文件的大小來說,使用
                   Using index 都可以提高查詢性能。也叫索引覆蓋掃描

這兩個(gè)地方是讓人經(jīng)常容易混淆的,并且它們并不是總是一起出現(xiàn)(雖然可能性不小),實(shí)際上他們沒有必然的聯(lián)系
下面是我的測試表結(jié)構(gòu)
mysql> show create table testud;

| Table  | Create Table                                                                                                                                                                                                                        |

| testud | CREATE TABLE `testud` (
  `id1` int(11) NOT NULL,
  `id2` int(11) DEFAULT NULL,
  `id3` int(11) DEFAULT NULL,
  `id4` int(11) DEFAULT NULL,
  PRIMARY KEY (`id1`),
  KEY `id2` (`id2`,`id3`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

1 row in set (0.05 sec)

1、可以單獨(dú)的出現(xiàn)type:index
mysql> explain select * from testud force index(id2) order by id2;

| id | select_type | table  | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra |

|  1 | SIMPLE      | testud | NULL       | index | NULL          | id2  | 10      | NULL |    3 |   100.00 | NULL  |

1 row in set, 1 warning (0.00 sec)

這里只是代表type=index避免的排序,但是需要從頭到尾使用雙向鏈表來訪問整個(gè)葉子結(jié)點(diǎn)
2、可以單獨(dú)出現(xiàn)Extra:Using index
mysql> explain select id2 from testud where id2=1;

| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref   | rows | filtered | Extra       |

|  1 | SIMPLE      | testud | NULL       | ref  | id2           | id2  | 5       | const |    1 |   100.00 | Using index |

1 row in set, 1 warning (0.00 sec)
這里type為ref,代表通過一個(gè)非唯一的索引進(jìn)行了單個(gè)值的掃描 id2=1,也就是這里的(id2,id3)是非唯一索引,而1是單個(gè)值,他考慮了索引
的B+樹的結(jié)構(gòu)也就是不僅僅考慮了葉子結(jié)點(diǎn),需要從根結(jié)點(diǎn)到分支節(jié)點(diǎn)(如果有),再到葉子結(jié)點(diǎn)來完成id2=1這種條件的過濾
而因?yàn)閕d2包含在索引(id2,id3)中當(dāng)然也就使用Using index 就可以了。
從上面兩種情況來看type:index和Extra:Using index并沒有必然的聯(lián)系。他們各自代表值的意思

3、共同出現(xiàn)這個(gè)就很簡單了。
mysql> explain select id2 from testud;

| id | select_type | table  | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |

|  1 | SIMPLE      | testud | NULL       | index | NULL          | id2  | 10      | NULL |    3 |   100.00 | Using index |

1 row in set, 1 warning (0.01 sec)


需要從頭到尾使用雙向鏈表來訪問整個(gè)葉子結(jié)點(diǎn),而索引id2包含了全部的需要的數(shù)據(jù)。


這里還需要提高Using index的一種特殊場景,也是很多人問過的。官方文檔叫做
9.2.1.7 Use of Index Extensions
簡單來說比如上面的KEY `id2` (`id2`,`id3`),我們知道葉子結(jié)點(diǎn)除了索引自己的數(shù)據(jù)實(shí)際上還有主鍵的數(shù)據(jù)在末尾,這個(gè)我在前面
已經(jīng)做過驗(yàn)證,參考:
http://blog.itpub.net/7728585/viewspace-2128817/
這個(gè)時(shí)候?qū)嶋H上索引id2 包含了 id2 id3 id1 這樣排列的數(shù)據(jù)如果id2相等按照id3排序如果id3相等按照id1排序的這樣一種結(jié)構(gòu),那么
我們的using index就擴(kuò)大了范圍比如下的語句:
mysql> explain select id1,id2,id3 from testud where id2=1;

| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref   | rows | filtered | Extra       |

|  1 | SIMPLE      | testud | NULL       | ref  | id2           | id2  | 5       | const |    1 |   100.00 | Using index |

1 row in set, 1 warning (0.01 sec)

我們可以看到Using index是生效的。

最后我們來簡單說明一下ORACLE中的索引覆蓋掃描
ORACLE中分為2種
index fast full scan:主要按照磁盤物理順序進(jìn)行掃描,我們知道鏈表之所以叫做鏈表是因?yàn)樗兄赶蚯盎蛘吆蟮闹羔槺热鏑語言中經(jīng)常用
*next *pr 來表示前后,既然是指向關(guān)系在物理上不一定是有序的。但是這種方式更快,可以使用物理上的多塊讀取,但是其返回?cái)?shù)據(jù)并不有序,仔細(xì)考慮實(shí)際上MYSQL中沒有這種方式。
index full scan:這種訪問返回就是有序的,他有點(diǎn)像MYSQL中的index+Using index 方式進(jìn)行掃描,同樣他也是為了避免排序而大量使用的。

看完上述內(nèi)容,你們對如何理解MYSQL中的type:index 和 Extra:Using有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


文章標(biāo)題:如何理解MYSQL中的type:index和Extra:Using
標(biāo)題網(wǎng)址:http://fisionsoft.com.cn/article/joseoj.html