es mysql 适用场景对比
es mysql 适用场景对比
问题一
全文检索毫无疑问直接上es,那么除了这种场景,什么时候该选es?为啥mysql不行?
对枚举字段的搜索
mysql创建索引的原则是对于那些区别度高字段建立索引,区别度越高的索引,在数据量大的情况下,索引效果越好。
因为mysql建立b+树时是这样,每创建一行就新建立索引字段,如果需要对枚举类型的字段进行搜索的时候比如该字段是布尔型只有两种值,对这种值进行搜索即使建立了索引效果仍然不好,如果一张表有千万数据,其中有
五百万数据是该值为true,需要搜索表中为true的数据,即使扫描索引,也要扫描500万次。
而es则不同,es建立的倒排索引是索引值后面跟了一个倒排列表,也就是只需要最多扫描两次便能找到数据。
复杂条件的搜索
当搜索的条件足够复杂后,比如10多个条件字段的搜索,由于b+树的特性,不可能同时对这10多个字段建立联合索引,此时用上es就很合适。es可以将10多个条件字段求出各自的bitmap,然后求交集。
问题二
抛开问题一的两种场景,当数据量越来越大时,应该选用es作为存储吗?
es针对海量数据的存储与搜索的好处在于,其水平扩容的便捷性。
mysql在数据量大了以后,涉及到分库分表,而分库分表带来的问题的是什么?其一是分库分表时,数据的迁移,需要考虑迁移过程中业务是否受到影响。其二在于 分库分表后业务系统的改动,比如翻页逻辑,可能需要去到每个库或表中查出前n条数据,然后进行翻页。
而es将扩容部分的这些都做了,es存数据是天然的分片存储,在海量数据查询时,可以通过增加副本的机制分担读压力。
那是不是在选用数据存储时,直接选用es就好了呢,这样以后可以不用担心扩容问题?
当然不是,来说说选用es的问题。
es比较吃系统资源。
来看一组数据,虽然环境有差异,可能不太准确,但能说明一定问题。
一台4c8g的 linux 云数据库,能支持大约上万qps,内存占用大概6g。
而我用一台mac m1 的8c 16g机器去做查询压测,当qps达到3700时,cpu就已经去到480% 超过了4核。
所以在产品并发量不高的情况下,只从数据存储而言,选用mysql会更节约成本。
但是单机的性能的确有限,如果产品对数据库的qps需要去到好几万,即使选用最高配的机器也是无法支撑的,这时选用多台便宜的机器来做将数据做分布式存储将更有优势。
所以我认为,当查询量越来越大以后,选用es来做海量数据存储,将不会担心数据查询问题,随着查询压力的上涨,可以通过增加副本来解决,虽然mysql可以通过分库分表解决,但是正如前面而言,分库分表的成本是比较大且风险是高于es扩容的,es增加副本带来的分片数据迁移工作,是由es集群自身完成,这样对于整个架构的扩展性来说是最高效便捷的。
感叹一句,架构就是这样,有得必有失,带来了架构的便捷性,但是可能对于mysql分库分表方案会更贵一点。
es mysql 适用场景对比的更多相关文章
- MySQL存储引擎对比
MySQL存储引擎对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的存储引擎 大家应该知道MySQL的存储引擎应该是表级别的概念,因为我们无法再创建databas ...
- 三个流行MySQL分支的对比
MySQL是历史上最受欢迎的免费开源程序之一.它是成千上万个网站的数据库骨干,并且可以将它(和Linux)作为过去10年里Internet呈指数级增长的一个有力证明. 那么,如果MySQL真的这么重要 ...
- Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...
- 超越MySQL:三个流行MySQL分支的对比(转)
导读:尽管MySQL是最受欢迎的程序之一,但是许多开发人员认为有必要将其拆分成其他项目,并且每个分支项目都有自己的专长.该 需求以及Oracle对核心产品增长缓慢的担忧,导致出现了许多开发人员感兴趣的 ...
- MQTT 与 RocketMQ 的应用场景对比
本文主要在什么是微消息队列 MQTT?的基础上介绍微消息队列 MQTT 和传统消息中间件的关联和区别,并针对实际应用场景下的产品选型给出建议. 背景信息 传统的消息中间件,例如消息队列 RocketM ...
- MySQL和Mongodb的区别与应用场景对比
MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...
- Mysql、MongoDB对比和使用场景
MongoDB: 更高的写入负载 默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景.但是应当避免在高事务安全性的系统中使用Mong ...
- Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...
- Solr与MySQL查询性能对比
本文简单对比下Solr与MySQL的查询性能速度. 测试数据量:10407608 Num Docs: 10407608 这里对MySQL的查询时间都包含了从MySQL Server获取数据的时 ...
- mysql各种引擎对比、实战
1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...
随机推荐
- DevOps|研发效能不是老板工程,是开发者服务
有人说研发效能是老板工程.不是的,研发效能不是老板工程,它不直接服务于老板(虽然老板可能看一些报表),反而是服务于广大产研运(产品+研发+质量+运维)的同学,所以有的公司也把研发效能叫做基础中台,平台 ...
- Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口
环境安装: (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4 上一篇相关随笔: Go语言:利用 TDD 测试驱动开发帮 ...
- Facebook 的 Thrift
更多内容,前往个人博客 Thrift 源于 Facebook,在 2007 年 Facebook 将 Thrift 作为一个开源项目提交给了 Apache 基金会.对于当时的 Facebook 来说, ...
- Kafka 管理【主题、分区、消费者组】
更多内容,前往 IT-BLOG 主题操作 使用 kafka-topics.sh 工具可以执行主题的大部分操作.可以用它创建.修改.删除和查看集群里的主题.要使用该工具的全部功能,需要通过 --zook ...
- unable to find Qt5Core.dll on PATH(已解决,超简单)
不久之前我在引用PyQt5库的时候总是出现unable to find Qt5Core.dll on PATH的错误,错误如下: 百度上都是说什么打包的时候出错,然后加上一句话,我试过以后也不行,后来 ...
- Chronicle Pro - 一款简单 Mac 理财规划师,管理你的的个人预算
使用Chronicle追踪和支付账单,管理你的个人预算,这是一款简单的Mac理财规划师.获得通知,这样你就不会错过下一个付款截止日期;你再也不用付滞纳金了.把你所有的账单放在一起,计划.检查和分析它们 ...
- nginx中的proxy_pass配置
Nginx 是最常用的反向代理工具之一,一个指令 proxy_pass搞定反向代理,对于接口代理.负载均衡很是实用,但 proxy_pass指令后面的参数很有讲究,通常一个/都可能引发一个血案. 通常 ...
- Qt源码阅读(三) 对象树管理
对象树管理 个人经验总结,如有错误或遗漏,欢迎各位大佬指正 @ 目录 对象树管理 设置父对象的作用 设置父对象(setParent) 完整源码 片段分析 对象的删除 夹带私货时间 设置父对象的作用 众 ...
- NEFUOJ P903字符串去星问题
Description 有一个字符串(长度小于100),要统计其中有多少个,并输出该字符串去掉后的新字符串. Input 输入数据有多组,每组1个连续的字符串; Output 在1行内输出该串内有多少 ...
- 由ASP.NET Core读取Response.Body引发的思考
前言 前几天有群友在群里问如何在我之前的文章<ASP.NET Core WebApi返回结果统一包装实践>的时候有点疑问,主要的疑问点就是关于Respouse的读取的问题.在之前的文章&l ...