对比 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 | 不支持 |
对比 elasticsearch 和 mysql的更多相关文章
- 搜索:ElasticSearch OR MySQL?
背景 我们开发一般的企业级Web应用,其实从本质上来说,都是对数据的增删查改进行各个维度的包装.所以说,不管你的程序如何开发,基本上,都离不开数据本身.那么,在开发企业级应用的过程中,很多同学一定遇到 ...
- Spring Boot整合ElasticSearch和Mysql 附案例源码
导读 前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boo ...
- Elasticsearch和mysql数据同步(elasticsearch-jdbc)
1.介绍 对mysql.oracle等数据库数据进行同步到ES有三种做法:一个是通过elasticsearch提供的API进行增删改查,一个就是通过中间件进行数据全量.增量的数据同步,另一个是通过收集 ...
- 为什么ElasticSearch比MySQL更适合全文索引
熟悉 MySQL 的同学一定都知道,MySQL 对于复杂条件查询的支持并不好.MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤,对这个过程不了解的同学可以先行 ...
- elasticsearch从mysql导入数据
详细:https://github.com/jprante/elasticsearch-jdbc(最下面有各数据库的导入方法说明) elasticsearch版本为1.5.2 1.下载 elastic ...
- Elasticsearch和mysql数据同步(logstash)
1.版本介绍 Elasticsearch: https://www.elastic.co/products/elasticsearch 版本:2.4.0 Logstash: https://www ...
- 【原创】运维基础之Docker(2)通过docker部署zookeeper nginx tomcat redis kibana/elasticsearch/logstash mysql kafka mesos/marathon
通过docker可以从头开始构建集群,也可以将现有集群(配置以及数据)平滑的迁移到docker部署: 1 docker部署zookeeper # usermod -G docker zookeeper ...
- elasticsearch和mysql排序问题
elasticsearch 字段类型错误 最近用elasticseach做排序,排序字段是float型的,没有使用mapping,是直接写代码导入的,没想到排序时如果有小数和整数就会出现错误. 于是查 ...
- 利用Logstash插件进行Elasticsearch与Mysql的数据
Logstash与Elasticsearch的安装就不多说了,我之前有两篇文章写的比较详细了ElasticSearch + Logstash + Kibana 搭建笔记 和 Filebeat+Logs ...
- elasticsearch配合mysql实现全文搜索
之前用了sphinx,发现很多东西很久都没更新过了,之前只是知道有elasticsearch这个东西,还以为是java才能用,所以一直没有去了解过,也许sphinx慢慢会被淘汰了吧. 前置条件:需要安 ...
随机推荐
- vue + antV G6 实现流程图完整代码 (antv G6 流程图)
效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 样式优先级的规则:!important`>行内样式>嵌入样式>外链样式>id选择器>类选择器>标签选择器>复合选择器>通配符>继承样式
CSS样式的优先级应该分成四大类 第一类`!important`,无论引入方式是什么,选择器是什么,它的优先级都是最高的. 第二类引入方式,行内样式的优先级要高于嵌入和外链,嵌入和外链如果使用的选择器 ...
- Python从list中随机取值
import random idList = ['11', '22', '23', '34', '35', '14', '45', '66', '88', ] def get_randomID(): ...
- 使用@Param注解时注意org.springframework.data.repository.query.Param与org.apache.ibatis.annotations.Param的区别
注解@Param有以下两种: 1.Spring org.springframework.data.repository.query.Param 2.mybatis org.apache.ibatis. ...
- #AI 绘图 #GitHub GitHub上这几个项目教你怎么用,让你成为神笔马良
1.前情提要 前两天在 GitHub Trending 上看到个利用 AI 自动给图片上色的项目(style2paints)火起来了. 在 AI 大行其道的时代,工程师们也开始思考如何用这项技术来解决 ...
- 小梅哥课程学习——串口发送应用之发送数据(适用于板级验证,时间间隔位100ms)
//此代码的注意事项,首先这个代码不能仿真成功会出现一定的时间延迟, //因为在做板级验证的时候把时间改成了100ms发送一次,要想仿真成功,把时间改成499999 //使用上一节课设计的发送模块,设 ...
- Windows下安装多个Redis实例
1.在Redis 目录下复制redis.windows-service.conf文件,建议命名规则redis.windows-service-port.conf,我们以6380端口为例. 2.打开re ...
- C输入输出
由于刚开始学的是cin和cout进行输入和输出,好多时候就不会写printf和scanf,所以导致有时候程序运行超时也不会改正,所以今天先说一说scanf和printf. 这是cin和cout的格式: ...
- CF1338E JYPnation
题意:给定一个竞赛图,且其中不包含任意一组三元环 $(a, b, c)$,满足 $a \to d$,$b \to d$,$c \to d$,求每个点两两之间的距离之和(若无法达到即为 $614n$). ...
- 图模配置文件之 flow.json
flow.json文件是用来配置图模导入时,各种不同的图模导入时,分别应该使用哪个映射文件对模型进行处理.在不同地区使用不同的格式的图模文件时,需要修改flow.json中相关的配置,来适应相应的图模 ...