Es与Mysql的区别,一看就懂!
(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality
OK.本来前一章了解了是如何给ES发送restful请求,这章是要准备搞一个增删改查的案例的
但是我觉得还是再详细的解释一遍ES和Mysql的区别,具体在哪里,方便后面的学习
Elasticsearch是分布式的全文检索引擎
Mysql是流行的关系型数据库
-
Elasticsearch面向文档
-
什么叫面向文档?
-
应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、 地理位置、另一个对象或者数组。
-
比如:你的数据可能是这个样子,或者更复杂
-
-
-
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 16137,
"max_score": 1,
"hits": [
{
"_index": "origin_flow_data_20190111",
"_type": "logs",
"_id": "AWg4fyND8G2qFi8QNpwr",
"_score": 1,
"_source": {
..........省略
}
..........省略
-
如果上面的数据存储到Mysql你需要怎么做?兄弟萌思考一下
-
如果将这些数据保存到由行和列组成的关系数据库中
-
就好像是把一个丰富,信息表现力强的对象拆散了放入一个非常大的表格中:
-
你不得 不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们
-
你忍心这么操作吗???兄弟
-
-
在Elasticsearch中是怎么处理的?
-
Elasticsearch是面向文档(document oriented)的
-
这个意思就是它可以存储整个对象或文档 (document),所以ES的Type(可以理解为Mysql的表)中的数据是这样的
-
当然可以更复杂!
-
而且它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索
-
在 Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
-
这种理解数据的方式与以往完全不同,所以这也是Elasticsearch能够执行复杂的全文搜索的原因之一
-
-
之前简单的总结过一次ES与Mysql的区别,这里再次总结一次
-
在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,
Relational DB -> Databases -> Tables -> Rows -> Columns //这个就是Mysql的结构,不多BB,都懂
Elasticsearch -> Index -> Types -> Documents -> Fields //这个就是ES的结构
#ES的index代表Mysql中的数据库
#ES的types代表Mysql中的Tables
#ES的Document代表Mysql中的行
#ES的Fields代表Mysql中的列
Elasticsearch集群可以包含多个索引index数据库
每一个索引可以包含多个类型 types表,
每一个类型包含多个文档documents行
每个文档包含多个字段 Fields列
解释一下当时我学习时的误区:摘自官方文档5.x版本
[索引]含义的区分 你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,
所以有必要在 此做一下区分:
索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,
它 是相关文档存储的地方,index的复数是indices 或indexes。
19/1/15张耀烽补充:
1:MySQL有事务性,而Elasticsearch没有事务性,所以你删了的数据是无法恢复的,
如果业务中包含大量的敏感数据,建议进行容灾备份(后续也会讲这个如何操作)
2:其次是Es也没有物理外键这个特性,如果你的数据强一致性要求比较高,还是建议慎用
ES本身就是支持分布式的,所以在这上面的投入可能会比你搞Mysql集群,分库分表方便多了
3:ES支持http协议 Json格式 9200端口,thrift,servlet,memcached,zeroMQ等的传输协议(通过插件方式集成)传统关系型数据库不支持
4.从低层原理上来说.ES采用倒排索引,关系型数据库Mysql采用的是B+树索引
5.在面对大数据量简单计算的时候ES的效率原高于Mysql传统数据库,但是在定位某一个唯一值,比如ID查询时并不需要ES
但在大数据的相似计算与搜索,ES的分布式并行计算有绝对的优势
6.Elasticsearch虽然已经在Lucene(底层搜索引擎)之上进行封装,但是操作还是繁琐,在Java中的应用,可能我们用Mysql搞一个不复杂的查询只需要5行代码(前提是Springboot项目),但是ES可能会写到50行+,虽然SpringData有对ES的封装,但是根本满足不了日常的开发,只能简单的使用,所以我建议还是自己动手封装
7.ES提供给Java的Api真的优美,很好扩展
...........后续想到继续补充
OK,ES与MYSQL的区别就先说到这里,后续有什么遗漏的地方我再补充----
下一章开始写restful的增删改查,
之后就是JavaApi如何使用!