欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

MySQL索引背后的數據結構及算法原理(2)

系統 2183 0

MySQL索引背后的數據結構及算法原理(2)

MySQL索引背后的數據結構及算法原理(2)

MySQL索引實現

  在MySQL中,索引屬于存儲引擎級別的概念,不同存儲引擎對索引的實現方式是不同的,本文主要討論MyISAM和InnoDB兩個存儲引擎的索引實現方式。

  MyISAM索引實現

  MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址。下圖是MyISAM索引的原理圖:

MySQL索引背后的數據結構及算法原理


  這里設表一共有三列,假設我們以Col1為主鍵,則圖8是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數據記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。如果我們在Col2上建立一個輔助索引,則此索引的結構如下圖所示:

MySQL索引背后的數據結構及算法原理

  同樣也是一顆B+Tree,data域保存數據記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。

  MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區分。

  InnoDB索引實現

  雖然InnoDB也使用B+Tree作為索引結構,但具體實現方式卻與MyISAM截然不同。

  第一個重大區別是InnoDB的數據文件本身就是索引文件。從上文知道,MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。

MySQL索引背后的數據結構及算法原理

  上圖是InnoDB主索引(同時也是數據文件)的示意圖,可以看到葉節點包含了完整的數據記錄。這種索引叫做聚集索引。因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。


  第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。換句話說,InnoDB的所有輔助索引都引用主鍵作為data域。例如,下圖為定義在Col3上的一個輔助索引:

MySQL索引背后的數據結構及算法原理

  這里以英文字符的ASCII碼作為比較準則。聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

  了解不同存儲引擎的索引實現方式對于正確使用和優化索引都非常有幫助,例如知道了InnoDB的索引實現后,就很容易明白為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。

  下一章將具體討論這些與索引有關的優化策略。

索引使用策略及優化

  MySQL的優化主要分為結構優化(Scheme optimization)和查詢優化(Query optimization)。本章討論的高性能索引策略主要屬于結構優化范疇。本章的內容完全基于上文的理論基礎,實際上一旦理解了索引背后的機制,那么選擇高性能的策略就變成了純粹的推理,并且可以理解這些策略背后的邏輯。

  示例數據庫

  為了討論索引策略,需要一個數據量不算小的數據庫作為示例。本文選用MySQL官方文檔中提供的示例數據庫之一:employees。這個數據庫關系復雜度適中,且數據量較大。下圖是這個數據庫的E-R關系圖(引用自MySQL官方手冊):

MySQL索引背后的數據結構及算法原理

  MySQL官方文檔中關于此數據庫的頁面為http://dev.mysql.com/doc/employee/en/employee.html。里面詳細介紹了此數據庫,并提供了下載地址和導入方法,如果有興趣導入此數據庫到自己的MySQL可以參考文中內容。


MySQL索引背后的數據結構及算法原理(2)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本黄色视 | 亚洲区激情区图片小说区 | ww1515hh海外永久360 | 谍影在线观看电视剧完整版 | 国产精品福利在线 | 欧美日韩亚洲国内综合网俺 | 不卡一区 | 久久综合婷婷香五月 | 国产精品亚洲一区 | 国产电影一区二区三区 | 久久久久中文 | 91国内外精品自在线播放 | 日韩在线欧美 | 97精品国产91久久久久久 | 蜜桃五月天 | 亚洲一区免费 | 五月婷婷 六月丁香 | 欧美视频网站 | 99久久精品国产片 | 久久99国产精品久久99无号码 | 舒淇三级浴室洗澡在线观看 | 波多野结衣在线免费播放 | 欧美一区精品 | 国内精品久久久久久中文字幕 | 久草经典视频 | 三级国产短视频在线观看 | 波多野结衣中文一区 | 欧美日韩在线影院 | 国产中文精品无码欧美综合小说 | 久久久久久久av | 韩国一大片a毛片 | 99久久99九九99九九九 | 国产欧美一区二区精品忘忧草 | 国产手机精品一区二区 | 日韩欧美动作影片 | 女人午夜色又刺激黄的视频免费 | 三上悠亚2022最新番号 | 男人激烈吮乳动态图 | 免费看国产片 | 日本不卡中文字幕一区二区 | 91国内在线视频 |