本文算读书笔记,图直接截取原文
mysql的B+树索引是一个二叉树,查找效率是logN,同时插入新的节点不必移动全部节点。兼顾了插入/更新与查询性能。
ES的Lucene 的倒排索引以追求查询的性能为第一目标,牺牲了一些更新的速度。
为什么 Elasticsearch/Lucene 检索可以比 mysql 快?
image.png
相对于mysql,索引以B+树的结构放在磁盘。
es有一个放在内存中的“索引的索引”,即Term index,先通过内存中的Term index查找对应Term dictionary的block位置,然后再去磁盘找相应的Term,由于这一层“索引的索引”设计,导致es比mysql查询过程中需要的磁盘随机读次数更少,那么查询速度自然更快。
还有特点是,直接截图了
image.png
其实所有的高性能依赖的都是具体的细节,每一个环节性能提高一点,最终实现高性能。
es组合索引与mysql的不同
mysql
如果是a,b的两个单列索引。使用查询条件select xxx from table where a=x,b=y时,默认数据库会选一个区分度更大的索引。就是说只能2选一。
如果是(a,b)这样的组合索引,那么这其实就是一个索引,a,b在一个B+树上。
ES
ES即使是组合索引,其实也是单独的单列索引分别查询,然后对结果进行归并。
image.png
使用者两种方式来使用组合索引