首页 > 数据库 > es mysql 适用场景对比

es mysql 适用场景对比

时间:2023-05-30 11:00:12浏览次数:52  
标签:分库 索引 场景 mysql 分表 数据 es

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分库分表方案会更贵一点。

标签:分库,索引,场景,mysql,分表,数据,es
From: https://www.cnblogs.com/hobbybear/p/17442654.html

相关文章

  • Hudi的OverwriteNonDefaultsWithLatestAvroPayload效果测试
    设置Payload为OverwriteNonDefaultsWithLatestAvroPayload:set`hoodie.datasource.write.payload.class`=`org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload`;插入和查询语句:insertintot71(ds,ut,pk,f0)values(20230101,CURRENT_TIMESTAMP,10......
  • 关于Addressable打包图集与图片都打进去造成冗余
    1)关于Addressable打包图集与图片都打进去造成冗余​2)Unity如何计算Root动画旋转3)IL2CPP编译的Protobuf反射类运行时报空4)为什么ActiveConstraints会出现过高的现象这是第337篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面......
  • The Importance of Particle Size Analysis in Preformulation Studies
    Thesizeoftheparticlesiscalledparticlesize.TheparticlesizeoftheAPIiscloselyrelatedtothehomogeneityofthepreparationprocessintermsofmixing,theaccuracyofdosage,andcompressibility,andithasanimpactonthesolubility,durat......
  • 【EXPLAIN】MySQL执行计划分析
    目录什么是执行计划?如何获取执行计划?执行计划结果分析idselect_typetabletype(重要)possible_keyskey(重要)key_lenrowsExtra(重要)什么是执行计划?执行计划是指一条SQL语句在经过MySQL查询优化器的优化会后,具体的执行方式。执行计划通常用于SQL性能分析、优化等场景。通过EXP......
  • ProgressBar控件(进度条)
    基础知识参阅官方文档:ProgressBar控件概述-WindowsForms.NETFramework|MicrosoftLearnC#ProgressBar的简单使用-Riku君-博客园(cnblogs.com)......
  • postgresql9.2.24安装
    1、yum安装 yum install -y postgresql-server postgresql-contrib 2、初始化 postgresql-setup initdb 3、挂载数据盘 ln -s /data/pgsql /var/lib/pgsqlchown -R postgres:postgres pgsql 4、修改配置文件pg_hba.conf localall......
  • MySQL-日期时间类型比较、互转
    【原理】日期、时间类型比较比较的是时间戳,即long型 【原理】日期、时间类型和字符串比较当涉及日期类型、时间类型和字符串类型比较时,会先将字符串转换成日期、时间类型,然后进行比较;例如:date_col<"2020-09-01",date_col是date类型,在比较时,会先将"2020-09-01"转换成dat......
  • 误删生产数据?利用mysql的Binlog进行恢复操作
    恢复至某个时间段的Mysql操作,和查看sql重新执行被删sql如果不小心删除了生产数据,你又想批量恢复,只要你的mysql开启了binlog,那么是可以恢复的。1、检查是否开启binlogshowvariableslike'log_%';保证为ON,记录下log_bin_basename,这是你的binlog存放位置如:/var/lib/mysql......
  • 【Oracle】Resize your Oracle datafiles down to the minimum without ORA-03297
      --Innon-multitenantDBsetlinesize1000pagesize0feedbackofftrimspoolonwithhwmas(--gethighestblockidfromeachdatafiles(fromx$ktfbueaswedon'tneedalljoinsfromdba_extents)select/*+materialize*/ktfbuesegtsnts......
  • An attempt has been made to start a new process before the current process has f
     Traceback(mostrecentcalllast): File"<string>",line1,in<module> File"E:\Eprogramfiles\Anaconda3\lib\multiprocessing\spawn.py",line116,inspawn_main   exitcode=_main(fd,parent_sentinel) File"E......