ES 的索引为什么比 Mysql的索引快 ---->Tire树

知识来源

答: 因为ES的倒排索引还做了 Term Index。

什么是Term Index?

: 将分词后的term进行排序索引,类似的mysql对于"term"(即主键,或者索引键)只是做了排序, 并且是大部分是放在磁盘上的,只有B+树的上层才是放在内存中的,查询仍然需要logN的访问磁盘,而ES将term分词排序后还做了一次索引,term index,即将term的通用前缀取出,构建成Trie树

trie树 :https://zh.wikipedia.org/wiki/Trie
这个树的缺点:存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存

通过这个树可以快速的定位到Term dictionary的本term的offset,再经过顺序查找,便可以很快找到本term的posting list。

什么是FST?

知识来源

: Finite State Transducer
FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。O(len(str))的查询时间复杂度。

Term Dictionary为什么节约空间?

Term dictionary 在磁盘上是以分 block 的方式保存的,一个 block 内部利用公共前缀压缩,比如都是 Ab 开头的单词就可以把 Ab 省去。这样 term dictionary 可以比 b-tree 更节约磁盘空间。

上个问题中的block和ES集成测试类ESIntegTestCase中的disableIndexBlock(String index, String block) 有关吗?

    /** Disables an index block for the specified index */
    public static void disableIndexBlock(String index, String block) {
        Settings settings = Settings.builder().put(block, false).build();
        client().admin().indices().prepareUpdateSettings(index).setSettings(settings).get();
    }

: 不知道

skip list 的原理是什么?

知识来源

: 跳跃表

你可能感兴趣的:(ES 的索引为什么比 Mysql的索引快 ---->Tire树)