对比 elasticsearch 和 mysql

https://www.cnblogs.com/darcy-yuan/category/2257608.html

最近阅读了elasticsearch的官方文档,学习了它的很多特性,发现elasticsearch和mysql有很多地方类似,也有很多地方不同。这里做一个对比,帮助大家加深对elasticsearch的理解。

|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|----------------------------------------------------------|
| 特性 | elasticsearch | mysql | 备注 |
| 场景 | 全文搜索,日志处理,空间数据分析 | 表结构存储 | es 不适合做join操作,mysql 不适合做全文检索 |
| 扩展性 | 动态扩展,能够通过添加node快速提升性能 | mysql cluster | |
| master 选举 | bully 算法,比较id选出master | master-slave结构,无需选举 | es中master选举可能会出现脑裂问题,配置 minimum_master_nodes参数确保过半选举决定机制 |
| 路由算法 | routing_factor = num_routing_shards / num_primary_shards shard_num = (hash(_routing) % num_routing_shards) / routing_factor 指定路由分片: my-index-000001/_doc/1?routing=user1&refresh=true | 手动路由,或者使用路由组件sharding-jdbc | |
| 可靠性 | Cross-cluster replication (CCR), 双集群设计 | 主从复制,双数据中心 | |
| 内存配置 | heap size 推荐 32g,但不要超过内存的一半, 其他需要用到堆外内存的地方,网络,文件缓存,jvm的栈 | 物理内存的80% | 单独的服务器 |
| 缓存 | filesystem cache, request cahce, query cache 所有cache都是基于node | query cache (deprecated) | |
| 数据块大小 | 分片大小 几g ~ 几十g, time based data, 20g ~ 40g 分片数量,每g内存小于20分片 shard越多,维护索引成本越高 shard越大,rebalance越慢 | 单表数据不超过2kw,3层b+树能存储的数据大概是2kw,如果b+层级变高,查询速度会显著降低 | |
| 数据结构 | json,底层是lucene | table,底层是b+ tree | |
| 索引 | 倒排表,fst 正向文件,分块 + 压缩 DocValues, 映射文件 + 压缩 | b+数,聚簇/非聚簇索引 | |
| 定义数据结构的方式 | mapping (dynamic mapping & static mapping) | schema | |
| 支持自动创建数据结构 | 是 | 否 | |
| 事务 | near real-time,需要refresh才可以查询到 | reaptable read,高级事务 | |
| 锁 | Index blocks,比如 index.blocks.read_only,索引只读 | 丰富的锁机制,表锁,行锁,间隙锁 | |
| 文件系统 | 默认mmapfs,采用内存映射方式访问文件,也支持其他的文件系统,比如fs, niofs, hybirdfs | fs | |
| 数据恢复 | es在写入之前会先将数据写入到translog,用来对异常情况进恢复 flush,lucene 进行提交,并且同时重新开启一段 translog index.translog.sync_interval,持久化translog 间隔,5s index.translog.flush_threshold_size, flush translog阈值大小,512m | redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求 | es 和 mysql 处理数据恢复的模式基本一致 |
| flush机制 | 从内存缓存写入磁盘缓存memorybuffer -> filesystem cache(refresh) 刷盘,filesystem cache -> disk ( flush) 定时触发或者 translog > 512M | buffer pool -> disk 当redo log满了,或者buffer pool空间不足 | es 和 mysql 刷盘模式基本一致 |
| 备份 | snapshot | mysqldump -u root -h host -p --all-databases > backdb.sql | |
| 慢日志 | 比如 index.search.slowlog.threshold.query.warn: 10s | long_query_time=10 | |
| 服务调用方式 | rest api | mysql connection + sql | |
| 数据类型 | 较为丰富的数据类型,boolean, keyword, long, data, object, nested, range, ip, text, arrays | int, data, varchar | es 提供了非常多的数据类型,一些是为了支持全文检索,一些能够方便查询,比如range,ip |
| 数据属性 | analyzer,分词器 index,是否被索引,没有被索引的字段不可查询 fielddata,如果想对text类型的字段进行聚合,排序,或者执行脚本,就必须设置fielddata属性 doc_values,将_source 转化为表结构放在磁盘上,方便聚合,排序,或者脚本操作,默认支持除了text类型的所有类型 ... | 主键索引, 可空,唯一值,自增,默认值 | es的数据属性更复杂 |
| 查询超时 | 设置 query timeout | set wait_timeout = 10 | |
| context | es查询需要区分query context, 还是 filter context,前者会进行打分,后者只进行过滤 | 不需要区分 | |
| 打分查询 | 比如match,match_phrase | 不支持 | |
| runtime field | 使用script 创建临时字段 | 语法支持 select concat (a, b) as c | script更灵活,但是性能会降低 |
| 精确查询 | 比如term, terms, ids, exists | 语法支持 | mysql使用起来更方便 |
| 分组聚合查询 | 比如histogram aggs,terms aggs | group by | es支持的类型稍微丰富一些,方便开发 |
| 指标聚合查询 | avg, max, min, sum ,count, cardinality aggs,percentile aggs | 语法支持, count(*), distinct | es是分布式的,聚合的时候存在一些精度问题 |
| 分页 | from + size (不适合深分页,有去重问题) search_after + PIT (推荐) scroll (不适合深分页) | limit + size 或者进行条件关联,书签 | 在深分页上的处理方案上基本一致 |
| profile | { "profile": true, "query" : { "match" : { "message" : "GET /search" } } } | explain | |
| script支持 | painless script | 不支持 | |

相关推荐
絮落锦乡1 小时前
ES DSL 常用修改语句
大数据·elasticsearch·搜索引擎
-曾牛1 小时前
Git完全指南:从入门到精通版本控制 ------- Git 查看提交历史(8)
大数据·git·学习·elasticsearch·个人开发
·云扬·2 小时前
【技术派后端篇】ElasticSearch 实战指南:环境搭建、API 操作与集成实践
大数据·elasticsearch·搜索引擎
StevenLdh3 小时前
Elasticsearch使用及常见的问题
大数据·elasticsearch·搜索引擎
Lary_Rock5 小时前
ubuntu20.04 Android14编译环境配置
大数据·数据库·elasticsearch
醉卧雕龙舫 、6 小时前
二.springBoot项目集成ElasticSearch及使用
spring boot·elasticsearch
小汤猿人类10 小时前
ES关系映射(数据库中的表结构)
大数据·数据库·elasticsearch
Elastic 中国社区官方博客11 小时前
Elasticsearch 8.18 中提供了原生连接 (Native Joins)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elastic 中国社区官方博客15 小时前
如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据
大数据·数据库·elasticsearch·搜索引擎·全文检索·logstash
坤小满学Java15 小时前
【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)
elasticsearch