接上篇《2、正向索引和倒排索引》
上一篇我们学习了什么是正向索引和倒排索引。本篇我们来学习Elasticsearch与Mysql的概念与区别。
一、文档
Elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在Elasticsearch中。
例如下面数据库的商品价格表中存储的4条数据,在序列化为json后的格式如下:
可以看到ES与Mysql数据库表数据格式的差异还是比较大的。
二、索引
索引(index)是相同类型的文档的集合。在Elasticsearch中,文档肯定不止一条,会有多条,这些n多的文档之间,是有差异的,如下面这些离散的各个文档:
如其中包含“id、name、age”的文档,应该是一个用户信息文档,而“id、title、price”的文档,应该是一个商品信息文档,剩下的“id、userId、goodsId、totalFee”的文档,包含了自己本身的id,用户的id,商品的id,订单费用,这个应该是一个订单信息文档。
那这里就按照文档蕾西结构给相似结构的文档进行了归类,这些相似结构的文档,就是一种索引,上述文档归类后,形成了“商品索引”、“用户索引”和“订单索引”:
这就有点像mysql这种关系型数据库的表(Table)的概念一样,不同类型的文档放在不同类型的索引库中,不同索引库的差别就是文档结构不同。
这种文档的结构在关系型数据库中叫“表(Table)”,而在es中叫做“映射(mapping)”,即索引中文档的字段约束信息(如文档中的字段有几个,每个字段是字符还是数字等),类似表的结构约束。
三、概念对比
以下是对传统Mysql数据库中的“表(Table)”、“行(Row)”、“列(Column)”、“表结构(Schema)”和“SQL语句”概念对比Elasticsearch做了一个横向对比:
其中Mysql中的“表(Table)”对应的就是上面讲到的es的“索引(index)”;
Mysql中的“行(Row)”对应的就是上面讲到的es中一个个的“文档(Document)”;
Mysql中的“列(Column)”对应的就是上面讲到的es中每个文档中包含的具体字段(Field);
Mysql中的“表结构(Schema)”对应的就是上面讲到的es中每个文档的字段结构,以及类型约束;
Mysql中的“SQL语句”对应的就是es提供的json风格的请求语句(DSL),是一种查询语法,实现文档的增删改查。Mysql的SQL语句是在连接数据库connection后,发出查询语句进行查询,而es则是通过http请求进行查询,因为es对外暴露的是RESTful风格的API接口,这种接口的好处就是跟语言无关,任何的语言只要能发http请求,就可以将DSL语句发给es来处理,这样就脱离了语言束缚。
四、架构对比
Mysql的架构和Elasticsearch架构各有优缺点,应用的场景也略有不同,谁都无法彻底替代谁。
Mysql擅长事务类型操作,可以确保数据的安全性和一致性。Elasticsearch擅长海量数据的搜索、分析和计算。
如果我们做的是一个下单付款的动作,对数据的安全性要求很高,需要事务模式的操作,那就应该使用Mysql进行存储;如果做的是海量商品的搜索,或是对页面的搜索,内容比较琐碎和复杂,那么使用Elasticsearch是比较合适的。
所以Mysql的和Elasticsearch不是一个替代关系,而是一个互补关系。大部分软件系统的架构中,这两个存储模式都会存在。如下图:
用户将增删改查(CRUD)请求发送给服务器,如果是“写”的操作,我们就将数据请求发给Mysql,由Mysql进行数据的存储;如果是“读”的操作,我们将数据请求发给Elasticsearch,由它来处理数据搜索的请求。而为了保持数据一致,Mysql写入或更新数据时,会同步给Elasticsearch,以保证es每次搜索的都是最新数据。
五、总结
●文档:一条数据就是一个文档,es中是Json格式;
●字段:Json文档中的字段;
●索引:同类型的文档的集合;
●映射:索引中文档的约束,比如字段名称、类型;
●Elasticsearch与数据库的关系:数据库负责事务类型操作,Elasticsearch负责海量数据的搜索、分析、计算。
参考:《黑马Elasticsearch全套教程》
转载请注明出处:https://guangzai.blog.csdn.net/article/details/144310481