MySql - 怎麼從磁盤查找數據

咱們已經知道數據頁的格式是這樣的:
image.png
假設咱們要查詢一個名字叫作張三的人,咱們是這樣查的:數據庫

  • 查找第一個數據頁的第一條數據,根據描述數據的變長字段的長度列表和null值列表定位字段的值,進行匹配操做。
  • 根據描述數據的next_record找到第二條數據,同上面的匹配操做。
  • 當前數據頁查找完了,根據數據頁指向下一個數據頁進行上面2個步驟操做。

因此這周非索引的,就至關於全表掃描,他會一個個數據頁的每行進行查找。
若是咱們查找主鍵id爲45的數據呢(假設每一個數據頁10條),咱們是這樣查的:spa

  • 經過索引找到數據頁,此時數據頁的id範圍爲41-50。
  • 而後根據二分查找定位到id爲45的數據。

這個查找包括了兩個東西,一個是主鍵,是遞增的,因此咱們在定位到數據頁的時候,能夠用二分查找。另一個就是索引,MySql的索引是B+樹結構,索引又分爲聚族索引跟非聚族索引。
索引在磁盤中,也是經過數據頁的形式,因此id=45查找的過程是這樣的:
在最頂層的數據頁中查找,發現45比101還小,因此他就往左邊的數據頁查找。
而後對比45和51,發現比51小,因而就定位數據頁4。
而後在數據頁4中,經過二分查找到45的id。
image.png
對於非聚族索引,查找的過程也是相似的,不一樣的他的葉子節點存儲的是索引對應的列的值以及索引的值,因此他還要經過索引的值繼續上面的操做,也就是回表。
既然索引能夠提高查詢效率,那咱們能夠多建幾個索引嗎?
咱們從這幾個來考慮:blog

  1. 索引是佔磁盤空間的,索引建的越多磁盤空間佔的越多。索引提高查詢效率其實就是已空間換時間。
  2. 索引是有序的,因此咱們對數據的新增、修改、刪除,都會直接影響到索引的從新排序,進而影響咱們對數據庫的操做。
相關文章
相關標籤/搜索