大廠面試必備(二)——數據庫存儲引擎

一、MYISAM存儲引擎索引實現

      存儲引擎形容的是數據庫還是形容表的?答案是表。
      在mysql中,數據庫的數據最終是存儲在我們電腦指定的磁盤位置上,找到mysql對應的data文件夾。如果某張表的索引是MyISAM,通過查看磁盤data文件夾裏面的文件我們可以看到,這張表有對應的三個文件:表名.frm、表名.MYD、表名.MYI。
      表名.frm存儲的是表結構相關的信息,也就是這張表大概是怎麼構成的;表名.MYD,其中MY是MyISAM的縮寫,D是代表data,所以這個文件存儲的是這張表裏面的數據行的記錄。表名.MYI,其中I代表Index,所以這個文件裏面存放的是這張表的索引字段。
在這裏插入圖片描述

  • MylSAM索引文件和數據文件是分離的(非聚集)
  • 從這張圖,我們可以看出Col1設置了MylSAM索引。比如但我們去查找Col1的值爲49的數據時,首先數據庫會先判斷Col1是否有索引,如果有,它就去表名.MYI文件裏面進行查找;當查找到相關地址信息時,它會通過這個地址,去表名.MYD中查找對應的數據。

二、InnoDB存儲引擎索引實現

      InnoDB索引實現(聚集)

  • 表數據文件本身就是按B+Tree組織的一個索引結構文件;
  • 聚集索引-葉節點包含了完整的數據記錄;
  • 爲什麼InnoDB表必須有主鍵,並且推薦使用整型的自增主鍵?
           Mysql在設計的時候,InnoDB的表必須必須用B+樹來組織。如果我們沒有設置主鍵或者索引,mysql會在後臺爲這張表生成一列唯一的數據,有點類似於我們說的rowid字段,它是一個整型字段(1,2,3,. . .),這一列數據我們看不到。推薦整型的話是因爲整型數字大小的比較比字符串的比較要快,試想一下兩個UUID作比較和兩個數字作比較。
  • 爲什麼非主鍵索引結構葉子節點存儲的是主鍵值?(一致性和節省存儲空間)
            在mysql數據庫,如果某張表的索引是InnoDB,通過查看磁盤data文件夾裏面的文件我們可以看到這張表對應的有兩個文件:表名.frm和表名.ibd
           同樣的,.frm文件存放的是表結構的文件,而.ibd文件則是數據文件和索引文件的合併。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章