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 适用场景对比的更多相关文章

  1. MySQL存储引擎对比

    MySQL存储引擎对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的存储引擎 大家应该知道MySQL的存储引擎应该是表级别的概念,因为我们无法再创建databas ...

  2. 三个流行MySQL分支的对比

    MySQL是历史上最受欢迎的免费开源程序之一.它是成千上万个网站的数据库骨干,并且可以将它(和Linux)作为过去10年里Internet呈指数级增长的一个有力证明. 那么,如果MySQL真的这么重要 ...

  3. Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  4. 超越MySQL:三个流行MySQL分支的对比(转)

    导读:尽管MySQL是最受欢迎的程序之一,但是许多开发人员认为有必要将其拆分成其他项目,并且每个分支项目都有自己的专长.该 需求以及Oracle对核心产品增长缓慢的担忧,导致出现了许多开发人员感兴趣的 ...

  5. MQTT 与 RocketMQ 的应用场景对比

    本文主要在什么是微消息队列 MQTT?的基础上介绍微消息队列 MQTT 和传统消息中间件的关联和区别,并针对实际应用场景下的产品选型给出建议. 背景信息 传统的消息中间件,例如消息队列 RocketM ...

  6. MySQL和Mongodb的区别与应用场景对比

    MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...

  7. Mysql、MongoDB对比和使用场景

    MongoDB: 更高的写入负载 默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景.但是应当避免在高事务安全性的系统中使用Mong ...

  8. Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比

    对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...

  9. Solr与MySQL查询性能对比

    本文简单对比下Solr与MySQL的查询性能速度. 测试数据量:10407608     Num Docs: 10407608 这里对MySQL的查询时间都包含了从MySQL Server获取数据的时 ...

  10. mysql各种引擎对比、实战

    1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...

随机推荐

  1. Spring框架中都用到了哪些设计模式 ?

    1.简单工厂模式 简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类.Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 bean 对 ...

  2. window计时器函数

    // 定时器: // 计时器 // 开启:setInterval() // 参数1:回调函数 // 参数2:毫秒数 // 功能:每个指定的毫秒数执行一次回调函数 demo: var t = setIn ...

  3. 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类

    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理. <?xml version="1.0" encoding="UTF-8&qu ...

  4. [Windows]解决:windows连接远程桌面-出现身份验证错误,要求的函数不受支持( CredSSP加密数据库修正)[转载]

    文由 需要在本地Windows系统电脑通过远程桌面(mstsc)另一台Windows服务器,将其内的数据拷贝过来.但却发生了这样的异常 解决方案 step1 Win+R step2 打开注册表: gp ...

  5. 自用纯C语言实现任务调度(可用于STM32、C51等单片机)

    前言   这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟 ...

  6. [GAUSS-50201]:The /opt/software/openGauss/xxxx-RedHat-64bit.tar.bz2 does not exist

    问题描述:使用redhat7.9来安装opengauss集群,预安装过不去.opengauss官方只支持centos版本,最好是centos7.6. [root@db01 script]# ./gs_ ...

  7. Git提交代码仓库的两种方式

    目录 一: 两种本地与远程仓库同步 1 git 远程仓库 提交本地版本库操作 提交到远程版本库操作 1.Git 全局设置: 2.增加一个远程仓库地址 3.查询当前存在的远程仓库 5.本地版本库内容提交 ...

  8. openwrt开发使用-arping

    前言 IP冲突引起的网络异常,可以通过检查IP是否冲突,排除故障.我们可以用一些工具进行检查,例如arp-scan.arping软件进行查看. 这里使用arping进行检查设备的MAC地址,通过查查看 ...

  9. Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解

    前言   qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的.  其中就包括华丽绚烂的三维图表,数据量不大的时候是可 ...

  10. 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)

    单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...