国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

淺談MySQL和Lucene索引的對比分析

2024-07-24 12:53:37
字體:
來源:轉載
供稿:網友

MySQL和Lucene都可以對數據構建索引并通過索引查詢數據,一個是關系型數據庫,一個是構建搜索引擎(Solr、ElasticSearch)的核心類庫。兩者的索引(index)有什么區別呢?以前寫過一篇《Solr與MySQL查詢性能對比》,只是簡單的對比了下查詢性能,對于內部原理卻沒有解釋,本文簡單分析下兩者的索引區別。

MySQL索引實現

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

MyISAM索引實現

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

圖1是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數據記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。B+Tree的所有葉子節點包含所有關鍵字且是按照升序排列的。

MyISAM表的索引和數據是分離的,索引保存在”表名.MYI”文件內,而數據保存在“表名.MYD”文件內。

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

InnoDB索引實現

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沁水县| 临夏市| 台北市| 于田县| 肥城市| 抚州市| 许昌县| 通许县| 奉节县| 沈阳市| 都江堰市| 枣阳市| 日照市| 从化市| 白水县| 南丰县| 无为县| 商丘市| 江华| 肃南| 长白| 新田县| 丹江口市| 闵行区| 台东县| 菏泽市| 洛浦县| 光泽县| 刚察县| 绥滨县| 忻州市| 武汉市| 灵台县| 余庆县| 吉隆县| 宁德市| 霞浦县| 德化县| 凉城县| 台江县| 广德县|