鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ 《高性能mysql》聚簇索引問(wèn)題

《高性能mysql》聚簇索引問(wèn)題

如下紅色框中的兩句話是什么意思?
之前在看多列索引的時(shí)候, 理解的是索引創(chuàng)建后, 會(huì)將每條記錄中對(duì)應(yīng)列的值也保存到索引樹(shù)中, 如果查詢的字段正好都被覆蓋到, 那都不用去回表了!

所以我的理解是索引樹(shù)中是有真正數(shù)據(jù)的, 那下面紅色框中的意思莫非是:“聚簇索引會(huì)在索引樹(shù)中將所有數(shù)據(jù)放進(jìn)去”?

clipboard.png

回答
編輯回答
伐木累

圖片描述,不知道你還能看懂,不懂再追問(wèn),我最近也在啃這本書

2018年3月11日 16:08
編輯回答
嘟尛嘴

簡(jiǎn)單來(lái)說(shuō),普通的索引,B-TREE中只索引了數(shù)據(jù)的位置,你用索引查找時(shí),先在樹(shù)中找到索引位置,但索引所在的節(jié)點(diǎn)只記錄了數(shù)據(jù)在磁盤中的物理位置,也就是說(shuō),引擎還需要在磁盤中讀取你要的數(shù)據(jù)

聚簇索引,索引的除了ID,還包括數(shù)據(jù)本身,即你只要在樹(shù)中找到索引的位置,數(shù)據(jù)也在該位置了,不用再去讀磁盤

2018年7月9日 00:14
編輯回答
擱淺

聚簇索引(clustered indexes)通常就是主鍵,存放的是記錄(數(shù)據(jù)行)本身。
其他索引(secondary indexes)存放的是主鍵地址。

官方文檔寫得很清晰
參考:
https://dev.mysql.com/doc/ref...

2018年6月28日 21:23
編輯回答
傲寒

問(wèn):聚簇索引會(huì)在索引樹(shù)中將所有數(shù)據(jù)放進(jìn)去么?
答:是的,它的數(shù)據(jù)行存放在索引的葉子頁(yè)中,且只有一份。

首先,理解聚簇索引

Every InnoDB table has a special index called the clustered index where the data for the rows is stored.

聚簇:術(shù)語(yǔ),表示數(shù)據(jù)行和相鄰的鍵值緊湊的存儲(chǔ)在一起。
那么,分開(kāi)來(lái)看,
聚簇索引 == 索引 + 數(shù)據(jù)存儲(chǔ)方式

  • 索引
    InnoDB 為例,其為 B-Tree 索引
  • 數(shù)據(jù)存儲(chǔ)方式
    即,聚簇索引 不光有 索引 ,還有存放在葉子頁(yè)的數(shù)據(jù)行

另外

  • 同一個(gè)表中,聚簇索引 只能有一個(gè),因?yàn)?無(wú)法同時(shí)把數(shù)據(jù)行放在兩個(gè)不同的地方
  • PRIMARY KEY 是一種典型的 聚簇索引InnoDB聚簇索引 具體選擇策略如下:

    • 如果你的表中定義了 PRIMARY KEY,那么,這就是此表的 聚簇索引;
    • 如果你的表中沒(méi)有定義 PRIMARY KEY,但是定義了 非空唯一索引,那么,InnoDB 會(huì)選擇第一個(gè) 非空唯一索引 作為此表的 聚簇索引;
    • 如果不滿足上述兩個(gè)條件,即表中沒(méi)有 PRIMARY KEY 也沒(méi)有合適的 UNIQUE,則 InnoDB 會(huì)自動(dòng)生成一個(gè)隱藏的聚簇索引,此索引包含一個(gè)單點(diǎn)遞增的 ID 列。
2018年7月17日 21:56