Elasticsearch的特点
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。
优势:
1)分布式的文件存储,每个字段都被索引且可用于搜索。
2)分布式的实时分析搜索引擎,海量数据下近实时秒级响应。
3)简单的restful api,天生的兼容多语言开发。
4)易扩展,处理PB级结构化或非结构化数据。(pb指petabyte,1PB=1024TB)
Elasticsearch和MySQL的区别
1)在存储上,es是document格式的存储,mysql是行格式的,所以es并不需要显式定义字段,而mysql需要。
2)在架构上,es天然就是分布式的,可以很容易的横向扩容,mysql不行。
3)在针对场景下,es无法做到实时,而mysql可以,因此mysql的OLTP (Online Transactional Processing,联机事务处理)对于es而言需要额外考虑下场景是否适用,可以认为es同时具有oltp和olap的特点,但两边都不是特别突出。
4)在数据存储量及性能上,mysql由于其索引实现(innodb为例)导致在数据量大到一定级别后会出现性能衰减;而es只要给足足够内存就没太大问题。插入速度上如果正确的配置mysql其性能并不低,当然相对于正常状态es而言还是差了一个到多个量级(es>mongo>mysql)。查询速度这个主要看索引和数量,在需要复杂关联查询的时候建议优先考虑mysql。
资源开销上,当数据量上去了后如果为了维持性能的话,es吃内存的能力绝对可以傲视群雄,但毕竟没有不吃草就能跑的快的马儿。
5)易用性上当然是mysql>es。其实刨掉全文检索场景,mysql(5.6以后)加上良好的设计就能很好的支持绝大部分需求了。
6)Elasticsearch会对所有输入的文本进行处理,建立索引放入内存中,从而提高搜索效率。在这一点上ES要优于MySQL的B+树的结构,MySQL需要将索引放入磁盘,每次读取需要先从磁盘读取索引然后寻找对应的数据节点,但是ES能够直接在内存中就找到目标文档对应的大致位置,最大化提高效率。
并且在进行组合查询的时候MySQL的劣势更加明显,它不支持复杂的组合查询比如聚合操作,即使要组合查询也要事先建好索引,但是ES就可以完成这种复杂的操作,默认每个字段都是有索引的,在查询的时候可以各种互相组合。
Elasticsearch比MySQL快的原因
对比:
1)基于分词后的全文检索:例如select * from test where name like ‘%张三%’,对于mysql来说,因为索引失效,会进行全表检索;对es而言分词后,每个字都可以利用FST高速找到倒排索引的位置,并迅速获取文档id列表,大大的提升了性能,减少了磁盘IO。
2)精确检索:进行精确检索,有些时候可能mysql要快一些,当mysql的非聚合索引引用上了聚合索引,无需回表,则速度上可能更快;es还是通过FST找到倒排索引的位置比获取文档id列表,再根据文档id获取文档并根据相关度进行排序。但是es还有个优势,就是es即天然的分布式能够在大量数据搜索时可以通过分片降低检索规模,并且可以通过并行检索提升效率,用filter时,更是可以直接跳过检索直接走缓存。
如果MySQL走索引,谁比较快?
进行精确检索,有些时候可能mysql要快一些,当mysql的非聚合索引引用上了聚合索引,无需回表,则速度上可能更快;es通过FST找到倒排索引的位置比获取文档id列表,再根据文档id获取文档并根据相关度进行排序。但是es还有个优势,就是es即天然的分布式能够在大量数据搜索时可以通过分片降低检索规模,并且可以通过并行检索提升效率,用filter时,更是可以直接跳过检索直接走缓存。