日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 架構師社區(qū)
[導讀]在InnoDB的數(shù)據(jù)頁到底長什么樣?這篇文章里,我們講了InnoDB數(shù)據(jù)頁長什么樣,簡單回顧下。圖1?InnoDB數(shù)據(jù)頁結構示意圖(圖片來自網絡)其中有的部分沒有詳細講解,因為暫時還用不到。比如PageDirectory頁目錄。上面講了數(shù)據(jù)頁的內部結構,數(shù)據(jù)庫最終所有的數(shù)據(jù)都是要...

在InnoDB的數(shù)據(jù)頁到底長什么樣?這篇文章里,我們講了InnoDB數(shù)據(jù)頁長什么樣,簡單回顧下。

深入理解為什么MySQL全表掃描很慢?

圖1?InnoDB數(shù)據(jù)頁結構示意圖(圖片來自網絡)


其中有的部分沒有詳細講解,因為暫時還用不到。比如Page Directory頁目錄。


上面講了數(shù)據(jù)頁的內部結構,數(shù)據(jù)庫最終所有的數(shù)據(jù)都是要放到磁盤上去的,那么大量的數(shù)據(jù)頁在磁盤上是怎么存儲的呢?其實數(shù)據(jù)頁之間會通過雙向鏈表連接起來。

深入理解為什么MySQL全表掃描很慢?

圖2 數(shù)據(jù)頁雙向鏈表連接起來


內存中的雙向鏈表大家都能理解,那么磁盤上的雙向鏈表是怎么搞的呢?


其實,數(shù)據(jù)頁在磁盤上就是一段數(shù)據(jù),里面包含的兩個指針,一個指向自己上一個數(shù)據(jù)頁的物理地址,一個指向下一個數(shù)據(jù)頁的物理地址。


每個數(shù)據(jù)頁內部的User Records行記錄部分會存儲一行一行的數(shù)據(jù),這些行數(shù)據(jù)會按照逐漸的大小進行排序存儲,每一行數(shù)據(jù)都有一個指針指向下一行數(shù)據(jù)的位置,組成單向鏈表。

深入理解為什么MySQL全表掃描很慢?

圖3 數(shù)據(jù)頁在磁盤文件里的物理存儲結構


數(shù)據(jù)頁的頁目錄是個重要的東西,目錄的作用就是方便檢索。這里的目錄,同樣有這樣的作用。


頁目錄里有很多個槽位(slots),這個槽位對應一組數(shù)據(jù),可以理解為真實數(shù)據(jù)與頁面中第0個字節(jié)之間的偏移量。每個槽中,存放著每個組里最大的那條記錄所在頁面中的地址偏移量。


頁目錄就存放的是主鍵與槽位的映射關系,如圖:

深入理解為什么MySQL全表掃描很慢?

圖4?頁目錄


所以說,如果你要根據(jù)主鍵查找一條數(shù)據(jù),假設你表里沒幾條數(shù)據(jù),那個表就一個數(shù)據(jù)頁,那就直接在數(shù)據(jù)頁里根據(jù)主鍵二分查找。


通過二分查找在目錄里迅速定位到逐漸對應的數(shù)據(jù)在哪個槽位里,然后到那個槽位里去,遍歷槽位里的每一行數(shù)據(jù),就能找到那個主鍵對應的數(shù)據(jù)了。


如果你沒辦法使用主鍵查詢,只能進到數(shù)據(jù)頁里,逐條數(shù)據(jù)遍歷查找了。


如果數(shù)據(jù)頁里有很多的數(shù)據(jù)頁,該如何查找呢?


假設你沒有建立任何索引,只能從第一個數(shù)據(jù)頁開始遍歷所有的數(shù)據(jù)頁,從第一個數(shù)據(jù)頁開始,把每個數(shù)據(jù)也從磁盤加載到buffer pool的緩存頁里去。


如果你是根據(jù)主鍵查找,你可以在數(shù)據(jù)頁的頁目錄里二分查找,如果是根據(jù)其他字段查找,就需要在數(shù)據(jù)頁里順著單鏈表遍歷了。


這個過程,其實就是全表掃描!


你在沒有任何所以的時候,查找數(shù)據(jù)就是一個全表掃描的過程,就是根據(jù)雙向鏈表把磁盤上的數(shù)據(jù)頁加載到磁盤的緩存頁里去,然后在緩存頁內部查找那條數(shù)據(jù)。


這個過程是非常滿的,所以說當數(shù)據(jù)量大的時候,全表掃描性能非常低,應該盡量避免全表掃描。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉