索引会自动更新吗_mysql的B+树中数据存放结构和索引常见问题你会吗?
問(wèn)題
解答問(wèn)題一
快速理解
你可以把mysql中存放的數(shù)據(jù)比作一本書(shū)的目錄,然后這個(gè)目錄中有大標(biāo)題,小標(biāo)題,大目錄,小目錄,目錄的最下面就是具體文章的頁(yè)數(shù)(InnoDB中最下面就是真實(shí)的數(shù)據(jù))。
詳解
首先B+樹(shù)的葉子節(jié)點(diǎn)我們已經(jīng)知道了存放的是真實(shí)數(shù)據(jù),那么其他節(jié)點(diǎn)呢?葉子節(jié)點(diǎn)的父節(jié)點(diǎn)存放的是什么?最簡(jiǎn)單的回答就是:存放的是目錄 ,這個(gè)目錄有點(diǎn)特殊,首先舉例來(lái)說(shuō):假如有三層樹(shù),最底層就是存放的數(shù)據(jù),第二層存放的是這條數(shù)據(jù)的 頁(yè)號(hào)和最小主鍵值,這個(gè)組合就是一條新的數(shù)據(jù),稱為目錄項(xiàng)記錄,很多條這種數(shù)據(jù)記錄著底層數(shù)據(jù)的主鍵和頁(yè)號(hào)信息,查找的時(shí)候可以通過(guò)最先通過(guò)記錄目錄項(xiàng)數(shù)據(jù)頁(yè)定位真實(shí)數(shù)據(jù)存放在哪個(gè)數(shù)據(jù)頁(yè)(InnoDB最小單位按頁(yè)來(lái)的,大小16KB),那第一層呢?第一層和第二層一樣,同樣存放的是第二層目錄項(xiàng)記錄的頁(yè)號(hào)和該頁(yè)下面的最小主鍵值,即數(shù)據(jù)頁(yè)中記錄的類型都一樣,但是主鍵范圍更廣了。
總結(jié)補(bǔ)充
用戶記錄和目錄項(xiàng)記錄存放的地方都是一樣的,都在基本單元數(shù)據(jù)頁(yè)里面,但是記錄類型有差別的,在每條記錄的頭信息中有個(gè)叫record_type字段,每一種代表不同的類型
sql 0:普通的用戶記錄 1:目錄項(xiàng)記錄 2:最小記錄 3:最大記錄 用上面這種儲(chǔ)存結(jié)構(gòu),熟悉二分法的我們很清楚,數(shù)據(jù)從小到大排列,每頁(yè)跨度逐漸減小,這不就是二分法的優(yōu)勢(shì)嗎?快速定位某一頁(yè),再?gòu)捻?yè)定位到真實(shí)記錄,這就是強(qiáng)大之處。
問(wèn)題二解答
B+樹(shù)中葉子節(jié)點(diǎn)存放的真實(shí)數(shù)據(jù)沒(méi)錯(cuò),但是每一棵樹(shù)并不是存放的是全部真實(shí)數(shù)據(jù),這里就牽扯到了聚集索引和輔助索引,聚集索引不需要人為的去主動(dòng)創(chuàng)建,你可以把上面提到的數(shù)據(jù)真實(shí)存放目錄當(dāng)作聚集索引,一開(kāi)始的時(shí)候就安排好了,數(shù)據(jù)就是按照這個(gè)目錄存放的。
輔助索引就不一樣了,我們隨機(jī)選取了某一列作為索引,那么InnoDB會(huì)新創(chuàng)建一棵B+樹(shù),數(shù)據(jù)存放的格式和前面提到的一樣,只不過(guò)排序的不是主鍵,而是你選取的這一頁(yè),底層葉子節(jié)點(diǎn)中你選取的列+主鍵,當(dāng)你使用這個(gè)索引的時(shí)候首先查詢到的是這個(gè)數(shù)據(jù)的主鍵,然后再去回表檢索完整數(shù)據(jù),需要注意的是,因?yàn)檫@些列的值可能是相同的,所以目錄項(xiàng)記錄的時(shí)候無(wú)法區(qū)分,所以和聚集索引有區(qū)別的是,輔助索引的目錄項(xiàng)記錄不僅包含頁(yè)號(hào)和列值,還有一個(gè)主鍵值。
聯(lián)合索引中B+樹(shù)葉子節(jié)點(diǎn)中數(shù)據(jù)排序方式就是按照你創(chuàng)建索引的那幾個(gè)列來(lái)的,第一列相同,則按照第二列,依次向后比對(duì)。而葉子節(jié)點(diǎn)的數(shù)據(jù)則包含你創(chuàng)建索引的幾個(gè)列和主鍵值,同樣檢索其他列數(shù)據(jù)需要回表操作。
問(wèn)題三解答
首先要明確的是,MyISAM中數(shù)據(jù)和索引是分離的,數(shù)據(jù)是數(shù)據(jù),索引是索引分開(kāi)儲(chǔ)存,通過(guò)索引行號(hào)定位數(shù)據(jù)的地址偏移量,然后回表迅速定位數(shù)據(jù)。所以如果要按照聚集索引的標(biāo)準(zhǔn)來(lái)說(shuō),那么MyISAM創(chuàng)建的索引均屬于二級(jí)索引。
#程序員##MySQL##索引#
總結(jié)
以上是生活随笔為你收集整理的索引会自动更新吗_mysql的B+树中数据存放结构和索引常见问题你会吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: scanf和printf在c语言中的作用
- 下一篇: 多个字段条件相同进行分组并过滤拼装SQL