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