亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 2333 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條評論
主站蜘蛛池模板: freexxxx性大陆另类 | 亚洲一区二区三区四区五区 | 色婷婷狠狠五月综合天色拍 | 91精品国产一区二区三区左线 | 欧美高清免费精品国产自 | 国产成人久久精品 | 欧美精品亚洲一区二区在线播放 | 国产精品久久国产三级国不卡顿 | 国产福利第一视频 | 国产精品免费久久久久影院 | 一级特黄aaa大片在线观看 | 久久是精品| 永久黄网站色视频免费观看99 | 亚洲国产清纯 | 永久黄网站色视频免费 | 天天操伊人 | 欧美黄色网址 | 欧美毛片在线 | 四虎4hu影库永久地址 | 中文字幕免费在线播放 | 欧美毛片又粗又长又大 | 欧美日韩一区二区三区自拍 | 亚洲男人的天堂在线视频 | 欧美亚洲天堂 | 国产日韩欧美在线观看不卡 | 日韩欧美成人免费中文字幕 | 亚洲视频成人 | 美女久久久久久久久久久 | 亚洲日韩成人 | 四虎影视永久免费观看地址 | 在线不卡免费视频 | 欧美一区欧美二区 | 狠久久 | 毛片一级免费 | 青青成人在线 | 日本中文一区 | 国产欧美自拍 | 中文在线不卡 | 综合欧美日韩一区二区三区 | 视频二区 中文字幕 欧美 | 夜间福利在线观看 |