elasticSearch与mysql的异同

305 阅读5分钟

前言

作为一个刚刚入行不久的Java后端开发,我个人认为还有很多知识我是没有掌握的,我写这些纯粹是我的个人总结,希望对大家有帮助,当然如果有哪里不对的地方,也希望大佬们多多指教。

情景

我们知道,当我们进行商品搜索也就是全文搜索的时候,mysql的性能问题就显现了,当然mysql也表示全文搜索会使得性能低下。然而,现在公司有一个业务(商品搜索、企业内部有大量的文档、知识等),涉及查询很多个字段,还是一定会走全文搜索的,甚至还需要相关性查询(也就是当你搜索“水果”,会搜索出来“苹果”;亦或者拼音查询),这个时候mysql的性能问题就不符合用户需求了,就需要使用到elasticSearch

为什么?

相同点

1.相信大家都理解mysql,其底层实现是B+Tree进行存储数据,通过正排索引进行查询的,一般分成两步:

1)通过二级索引树查询到对应的ID

2)拿到的对应ID去表记录索引树中查询整一条数据

mysql有个好处就是,如果通过二级索引树查询到了对应的数据,就不需要再走第二步了,也就是我们说的覆盖索引。 但是由二级索引树去查询对应的ID这个操作,是不是感觉很像倒排索引

2.elasticSearch,大家公认的是通过倒排索引进行查询的,由于es是会对文档中每一个词语(术语)建立索引,记录这个词语再哪个ID中出现,其查询也是分成两步:

1)根据关键词,分词器会将关键词变成多个词语,再查询这些词语被记录ID由哪些

2)根据ID,查询到整一条数据

欸,相信大家惊奇的发现了点什么,怎么感觉这es与mysql的查询方式是一样的!!!

注:如果想要看更加详细版的,大家可以看一下这个金主大佬写的,有图有真相的:juejin.cn/post/738404…

异同点

为什么查询的行为是基本一致的,但是其适用场景却截然相反呢?

个人认为,其主要原因是核心设计目标、底层存储方式不一样。

1.核心设计目标

​​MySQLElasticsearch
定位关系型数据库(RDBMS)分布式搜索引擎 + 分析引擎
核心目标确保数据的强一致性事务完整性实现快速搜索海量数据分析
典型场景银行交易、用户账户管理商品搜索、日志分析、监控数据

2.存储方式对比

​​MySQLElasticsearch
数据组织表格结构(行和列)关系型数据库文档结构(JSON 格式)非关系型数据库
模式(Schema)​严格预定义(需先设计表结构动态灵活(可自动推断字段类型)
数据关系支持外键、JOIN 操作无 JOIN,通过冗余或嵌套文档处理关系
查询语言SQL(结构化查询)RESTful API + JSON DSL(领域特定语言)

总的来讲就是

1.MySQL:是关系型数据库,数据以表的形式存储,表与表之间可以通过关联关系(如主键、外键)来建立联系。就像一个严谨的档案库,每个文件都有固定的格式和位置。一般只会对索引字段建立索引,输入关键词时,这个关键词数据只能是某个字段的,会立马根据这个字段进行查询对应的ID,因此在进行精确查询的时候,性能优势就来了。

2.Elasticsearch:是非关系型数据库(文档型数据库),数据以 JSON 文档的形式存储,文档之间没有严格的关联关系,更像是一个装满各种资料的大箱子,资料之间没有固定的关联方式。会对文档中每一个词语建立索引,这个词语对应多个ID。当输入关键词,会立马将关键词分词,快速将这些词语进行对比索引表,看看对应哪些ID,最后进行合并即可。

其实,还有别的区别:

3.扩展性与分布性

​​MySQLElasticsearch
扩展方式垂直扩展(提升单机性能)水平扩展(自动分片 + 分布式存储)
分片机制需手动分库分表(复杂)自动分片(数据分散到多个节点)
数据一致性强一致性(ACID)最终一致性(近实时搜索)
事务支持完整 ACID(原子性、一致性等)不支持事务(单文档操作是原子的)

可能直接看这个表不太理解,换一个通俗的理解

1)mysql类似一个跑车,想要提升速度,那就只能更换更好的发动机,即单机升级

2)es类似一个火车,增加车厢也就可以装载更多的货物。也就是Elasticsearch 会将数据分散存储在多个节点上,每个节点存储数据的一部分。它把索引分成多个分片(shard),每个分片可以有多个副本(replica)。比如一个索引有 5 个主分片和 3 个副本分片,这些分片会分布在不同节点上。

从这里也可以看出来es适合全文查询。

而对于强一致性,意思是数据更新后,所有的查询都能立即看到最新的数据。但是es由于要维护多个节点数据,只能选择最终一致性,即数据更新后,可能需要一定的时间才能在所有节点上看到最新的数据。

从这里就可以看出来,对于银行交易、电商订单、支付转账等功能,就不要给es去处理了,不然造成的问题就大大的了。