对比 elasticsearch 和 mysql - darcy_yuan
source link: https://www.cnblogs.com/darcy-yuan/p/17250585.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
对比 elasticsearch 和 mysql
最近阅读了elasticsearch的官方文档,学习了它的很多特性,发现elasticsearch和mysql有很多地方类似,也有很多地方不同。这里做一个对比,帮助大家加深对elasticsearch的理解。
特性 | elasticsearch | mysql | 备注 |
场景 | 全文搜索,日志处理,空间数据分析 | 表结构存储 | es 不适合做join操作,mysql 不适合做全文检索 |
扩展性 | 动态扩展,能够通过添加node快速提升性能 | mysql cluster | |
master 选举 | bully 算法,比较id选出master | master-slave结构,无需选举 | es中master选举可能会出现脑裂问题,配置
minimum_master_nodes参数确保过半选举决定机制 |
路由算法 |
指定路由分片:
|
手动路由,或者使用路由组件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 |
|
explain | |
script支持 | painless script | 不支持 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK