elasticsearch为什么⽐mysql快
想要搞清这个问题要从mysql和ES的索引数据结构下⼿,咱们先了解⼀下mysql的索引结构,然后再了解⼀下ES的索引结构,然后再进⾏对⽐这个问题就会很清楚了。
mysql关系型数据库索引原理:
数据库的索引是B+tree结构
主键索引是聚合索引,其他索引是⾮聚合索引
聚合索引:
可以通过主键直接到数据。
⾮聚合索引:
如果mysql根据⾮聚合索引去查询数据,⾸先要通过⾮聚合索引到对应的主键id,再去根据主键id⾛聚合索引到数据
Elasticsearch倒排索引原理:
在讲倒排索引之前咱们先说⼀下正向索引
正向索引的结构就是每个⽂档和关键字做关联,每个⽂档都有与之对应的关键字,记录关键字在⽂档中出现的位置和次数。但是⽤户查询的时候是根据关键字去查询的。当⽤户想要查询“iPhone”,这时候会扫描所有⽂档出包含iPhone的⽂档,可想⽽知当线上数据量⾮常庞⼤的情况下,这样的索引结构根本⽆法满⾜实时返回排名结果的要求。
倒排索引
倒排索引是根据关键词去查⽂档的id,每个关键词都会有与之对应的⽂档id。倒排索引是实现“单词-⽂档矩阵”的⼀种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的⽂档列表。倒排索引主要由三个部分组成:“单词词典”、“排序列表”和”“倒排⽂件”。
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由⽂档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本⾝的⼀些信息以及指向“倒排列表”的指针。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有⽂档的⽂档列表及单词在该⽂档中出现的位置信息,每条记录称为⼀个倒排项(Posting)。根据倒排列表,即可获知哪些⽂档包含某个单词。
倒排⽂件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个⽂件⾥,这个⽂件即被称之为倒排⽂件,倒排⽂件是存储倒排索引的物理⽂件。
mysql帮助文档两者对⽐:
第⼀种情况:
基于分词后的全⽂检索:例如select * from test where name like '%张三%',对于关系型数据库mysql来说简直是⼀种灾难,因为会进⾏全表检索,但是对es⽽⾔分词后,每个字都可以利⽤FST⾼速到倒排索引的位置,并迅速获取⽂档id列表,⼤⼤的提升了性能减少了磁盘IO。
第⼆种情况:
精确检索:进⾏精确检索,有些时候可能mysql要快⼀些,当mysql的⾮聚合索引引⽤上了覆盖索引,⽆需回表,则速度上可能更快,但是es还是通过FST到倒排索引的位置⽐获取⽂档id列表,再根据⽂档id获取⽂档并根据相关度进⾏排序。但是es还有个优势,就是es即天然的分布式使得在⼤量数据搜索时可以通过分⽚降低检索规模,并且可以通过并⾏检索提升效率,⽤filter时更是可以直接跳过检
索直接⾛缓存
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论