游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

程序员必须要了解的数据库选型经验

  (关注数据库架构师公众号,提升数据库技能,助力职业发展)
  工作中总是遇到数据存储相关的需求工单,新需求开发设计中也多多少少会有数据模型设计和存储相关的问题。经过几次存储方案设计选型和讨论后发现需要有更全面的思考框架。日常开发中常用的存储方案选型很多都是拿来主义的,凭借着经验、习惯选用,但对它们的细节特性或约束少有研究。除了手边会用的存储方案,也应该关注市面上更合适的存储方案。一定的技术预研和储备能够帮助未来更好的技术方案设计。
  故写了这篇文章,抛出我的总结和思考,希望日后可以将一些更先进(合适)的技术引入业务开发中,助力业务发展。
  存储选型的考虑要素
  存储选型的目的还是为了我们的使用场景和用户服务,因此在选型前需要回答自己一些业务指标技术指标方面的问题,以便于我们清楚存储选型的应用环境。用户量:用户量预估多少?几百万还是几亿?数据量:数据量预估多少?日均增量能有多少?读写偏好:数据是读多一些还是写多一些?数据场景:强事务型还是分析型需求?运行性能要求:并发量是多少?高峰、平均、低谷分别预估是多少?
  存储引擎分类及特性
  数据库的分类方式非常多样,因参考维度不同而存在较大差异,下面是常见的一些分类。
  数据库类型
  常见数据库
  关系型
  MySQL、Oracle、DB2、SQLServer等。
  非关系型
  Hbase、Redis、MongodDB等。
  行式存储
  MySQL、Oracle、DB2、SQLServer等。
  列式存储
  Hbase、ClickHouse等。
  分布式存储
  Cassandra、Hbase、MongodDB等。
  键值存储
  Memcached、Redis、MemcacheDB等。
  图形存储
  Neo4J、TigerGraph等。
  文档存储
  MongoDB、CouchDB等。
  先拿我们最熟悉的关系数据库来说,它的优点非常多,我们选用关系数据库的理由可简单概括为以下几点:容易理解
  可由二维表结构来逻辑表达,相对网状、层次等其他模型更加容易被理解。严格遵循数据格式与长度规范,数据以行为单位,一行数据表示一个实体信息,每一行数据的属性都是相同的。操作方便
  通用的SQL语言使得操作关系型数据库非常方便,支持join等复杂查询,Sql二维关系是关系型数据库最无可比拟的优点,这种易用性非常贴近开发者。事务特性
  支持ACID特性,可以维护数据之间的一致性,这是使用关系数据库非常重要的一个理由,例如同银行转账,张三转给李四100块钱,张三扣100元,李四加100元,而且必须同时成功或者同时失败,否则就会造成用户的资损。数据稳定
  数据持久化到磁盘,没有丢失数据风险。服务稳定
  最常用的关系型数据库产品MySql、Oracle服务器性能卓越,服务稳定,通常很少出现宕机异常。
  然而,在享受关系数据库带来的便利的同时,我们也不得不面临很多麻烦的问题:高并发下数据库瓶颈明显
  数据按行存储,即使只针对其中某一列进行运算,也会将整行数据从存储设备中读入内存,导致IO较高。写入更新频繁的情况下,数据库往往会出现CPU飙高、Sql执行慢、客户端报数据库连接池不够等异常情况,且性能瓶颈通过加CPU、换固态硬盘、继续买服务器加数据库做分库等方式处理ROI不高,受限于其本身的特点,可能花了很多钱都未必能达到想要的效果。因此例如万人秒杀这种场景,我们绝对不可能通过数据库直接去扣减库存,需要做好流量漏斗。为维护索引付出的代价大
  为了提供丰富的查询能力,通常热点表都会有多个二级索引,一旦有了二级索引,数据的新增必然伴随着所有二级索引的新增,数据的更新也必然伴随着所有二级索引的更新,这不可避免地降低了关系型数据库的读写能力,且索引越多读写能力越差。除了数据文件不可避免地占空间外,索引占的空间其实也并不少。为维护数据一致性付出的代价大
  数据一致性是关系型数据库的核心,但是同样为了维护数据一致性的代价也是非常大的。我们都知道SQL标准为事务定义了不同的隔离级别,从低到高依次是读未提交、读已提交、可重复度、串行化,事务隔离级别越低,可能出现的并发异常越多,但是通常而言能提供的并发能力越强。那么为了保证事务一致性,数据库就需要提供并发控制与故障恢复两种技术,前者用于减少并发异常,后者可以在系统异常的时候保证事务与数据库状态不会被破坏。对于并发控制,其核心思想就是加锁,无论是乐观锁还是悲观锁,只要提供的隔离级别越高,那么读写性能必然越差。水平扩展后带来的种种问题难处理
  随着业务规模扩大,一种方式是对数据库做分库,做了分库之后,数据迁移(1个库的数据按照一定规则达到2个库中)、跨库join、分布式事务处理都是需要考虑的问题,尤其是分布式事务处理,业界当前都没有特别好的解决方案。表结构扩展不方便
  由于数据库存储的是结构化数据,因此表结构schema是固定的,扩展不方便,如果需要修改表结构,需要执行DDL(datadefinitionlanguage)语句修改,修改期间会导致锁表,部分服务不可用。全文搜索功能弱
  例如like中国真伟大,只能搜索到2019年中国真伟大,爱祖国,无法搜索到中国真是太伟大了这样的文本,即不具备分词能力,且like查询在中国真伟大这样的搜索条件下,无法命中索引,将会导致查询效率大大降低。
  如上文所分析的,关系型数据库优点明显,缺点同样不能忽视,因此通常在企业规模不断扩大的情况下,不会一味指望通过增强数据库的能力来解决数据存储问题,而是会引入其他存储,也就是我们说的NoSql。
  NoSql的全称为NotOnlySQL,泛指非关系型数据库,是对关系型数据库的一种补充,特别注意补充这两个字,这意味着NoSql与关系型数据库并不是对立关系,二者各有优劣,取长补短,在合适的场景下选择合适的存储引擎才是正确的做法。下面看一下常用的NoSql及他们的代表产品,并对每种NoSql的优缺点和适用场景做一下分析,便于熟悉每种NoSql的特点,方便技术选型。
  KV型NoSql(代表Redis)
  KV型NoSql顾名思义就是以键值对形式存储的非关系型数据库,是最简单、最容易理解也是大家最熟悉的一种NoSql。Redis、MemCache是其中的代表,Redis又是KV型NoSql中应用最广泛的NoSql,KV型数据库以Redis为例,最大的优点总结下来主要有两点:数据基于内存,读写效率高KV型数据,时间复杂度为O(1),查询速度快
  因此,KV型NoSql最大的优点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可达到10万的级别,性能非常强劲。同样的Redis也有所有KV型NoSql都有的比较明显的缺点:只能根据K查V,无法根据V查K查询方式单一,只有KV的方式,不支持条件查询,多条件查询唯一的做法就是数据冗余,但这会极大的浪费存储空间内存是有限的,无法支持海量数据存储由于KV型NoSql的存储是基于内存的,会有丢失数据的风险(有持久化存储方案)
  综上所述,KV型NoSql最合适的场景就是缓存的场景:读远多于写读取能力强没有持久化的需求,可以容忍数据丢失
  针对那些读远多于写的数据,引入一层缓存,每次读从缓存中读取,缓存中读取不到,再去数据库中取,取完之后再写入到缓存,对数据做好失效机制通常就没有大问题了。通常来说,缓存是性能优化的第一选择也是见效最明显的方案。
  搜索型NoSql(代表ElasticSearch)
  传统关系型数据库主要通过索引来达到快速查询的目的,但是在全文搜索的场景下,索引是无能为力的,like查询一来无法满足所有模糊匹配需求,二来使用限制太大且使用不当容易造成慢查询,搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题,ElasticSearch是搜索型NoSql的代表产品。
  全文搜索的原理是倒排索引,我们看一下什么是倒排索引。要说倒排索引我们先看下什么是正排索引,传统的正排索引是文档关键字的映射,例如Tomismyfriend这句话,会将其切分为Tom、is、my、friend四个单词,在搜索的时候对文档进行扫描,符合条件的查出来。这种方式原理非常简单,但是由于其检索效率太低,基本没什么实用价值。
  倒排索引则完全相反,它是关键字文档的映射,举例来说,现在这里有四个短句:TomisTomTomismyfriendThankyou,BettyTomisBettyshusband
  搜索引擎会根据一定的分词规则将一句话切成N个关键字,并以关键字的维度维护关键字在每个文本中的出现次数。这样下次搜索Tom的时候,由于Tom这个词语在TomisTom、Tomismyfriend、TomisBetty’shusband三句话中都有出现,因此这三条记录都会被检索出来,且由于TomisTom这句话中Tom出现了2次,因此这条记录对Tom这个单词的匹配度最高,最先展示。这就是搜索引擎倒排索引的基本原理,假设某个关键字在某个文档中出现,那么倒排索引中有两部分内容:文档ID在该文档中出现的位置情况
  可以举一反三,我们搜索BettyTom这两个词语也是一样,搜索引擎将BettyTom切分为Tom、Betty两个单词,根据开发者指定的满足率,比如满足率50,那么只要记录中出现了两个单词之一的记录都会被检索出来,再按照匹配度进行展示。
  搜索型NoSql以ElasticSearch为例,它的优点为:支持分词场景、全文搜索,这是区别于关系型数据库最大特点支持条件查询,支持聚合操作,类似关系型数据库的GroupBy,但是功能更加强大,适合做数据分析数据写文件无丢失风险,在集群环境下可以方便横向扩展,可承载PB级别的数据高可用,自动发现新的或者失败的节点,重组和重新平衡数据,确保数据是安全和可访问的
  同样,ElasticSearch也有比较明显的缺点:性能全靠内存来顶,也是使用的时候最需要注意的点,非常吃硬件资源、吃内存,大数据量下64GSSD基本是标配,相同的配置多一倍内存,一个月差不多就要多花好多钱。至于ElasticSearch内存主要用在以下几个地方:
  a。IndexingBufferElasticSearch基于Luence,Lucene的倒排索引是先在内存里生成,然后定期以SegmentFile的方式刷磁盘的,每个SegmentFile实际就是一个完整的倒排索引
  b。SegmentMemory倒排索引前面说过是基于关键字的,Lucene在4。0后会将所有关键字以FST这种数据结构的方式将所有关键字在启动的时候全量加载到内存,加快查询速度,官方建议至少留系统一半内存给Lucene
  c。各类缓存FilterCache、FieldCache、IndexingCache等,用于提升查询分析性能,例如FilterCache用于缓存使用过的Filter的结果集
  d。CluterStateBufferElasticSearch被设计为每个Node都可以响应用户请求,因此每个Node的内存中都包含有一份集群状态的拷贝,一个规模很大的集群这个状态信息可能会非常大读写之间有延迟,写入的数据差不多1s样子会被读取到(数据写入时需要维护很多索引)数据结构灵活性不高,字段一旦建立就没法修改类型了,假如建立的数据表某个字段没有加全文索引,想加上,那么只能把整个表删了再重建。
  因此,搜索型NoSql最适用的场景就是有条件搜索尤其是全文搜索的场景,作为关系型数据库的一种替代方案,通常搜索型NoSql也会作为一层前置缓存,来对关系型数据库进行保护。
  另外,搜索型数据库还有一种特别重要的应用场景。我们可以想,一旦对数据库做了分库分表后,原来可以在单表中做的聚合操作、统计操作是否统统失效?例如我把订单表分16个库,1024张表,那么订单数据就散落在1024张表中,我想要统计昨天浙江省单笔成交金额最高的订单是哪笔如何做?我想要把昨天的所有订单按照时间排序分页展示如何做?这就是搜索型NoSql的另一大作用了,我们可以把分表之后的数据统一打在搜索型NoSql中,利用搜索型NoSql的搜索与聚合能力完成对全量数据的查询。
  列式NoSql(代表HBase)
  列式NoSql和关系型数据库一样都有主键的概念,区别在于关系型数据库是按照行组织的数据,数据字段即使没有值同样占空间,列式存储完全是另一种方式,它是按列进行数据组织的,好处在于:查询时只有指定的列会被读取,不会读取所有列存储上节约空间,空值不会被存储,一列中有时候会有很多重复数据(尤其是枚举数据,性别、状态等字段),这类数据可压缩列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中
  大数据时代最具代表性的技术之一HBase就是列式NoSQL的产品实现,其优点主要是:海量数据存储,PB级别数据随便存,底层基于HDFS(Hadoop文件系统),数据持久化读写性能好,只要没有滥用造成数据热点,读写基本没任何问题横向扩展在关系型数据库及非关系型数据库中都是最方便的之一,只需要添加新机器就可以实现数据容量的线性增长,且可用在廉价服务器上,节省成本可存储结构化或者半结构化的数据本身没有单点故障,可用性高列数理论上无限制,HBase本身只对列族数量有要求,建议13个
  缺点主要表现在:HBase是Hadoop生态的一部分,因此它本身是一款比较重的产品,依赖很多Hadoop组件,数据规模不大没必要用,运维还是有点复杂的。不支持分页查询,因为统计不了数据总数。KV式存储,条件查询很弱,HBase在Scan扫描一批数据的情况下还是提供了前缀匹配这种API的,条件查询除非定义多个RowKey做数据冗余。
  因此HBase比较适用于KV型存储且未来无法预估数据增长量的场景,另外HBase使用还是需要一定的经验,主要体现在RowKey的设计上。
  文档型NoSql(代表MongoDB)
  文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML格式存储数据,因此文档型NoSql是没有Schema的,由于没有Schema的特性,我们可以随意地存储与读取数据,因此文档型NoSql的出现是解决关系型数据库表结构扩展不方便的问题的。
  MongoDB是文档型NoSql的代表产品,同时也是所有NoSql产品中的明星产品之一,它的很多概念与关系数据库类似,因此,对于MongDB,我们只需要理解成一个FreeSchema的关系型数据库就好了,其优点主要是:没有预定义的字段,扩展字段容易相较于关系型数据库,读写性能优越,命中二级索引的查询不会比关系型数据库慢,对于非索引字段的查询则是全面胜出
  缺点在于:不支持事务操作,虽然Mongodb4。0之后宣称支持事务,但是效果待观测多表之间的关联查询不支持(虽然有嵌入文档的方式),join查询还是需要多次操作空间占用较大,这个是MongDB的设计问题,空间预分配机制删除数据后空间不释放,只有用db。repairDatabase()去修复才能释放目前没发现MongoDB有关系型数据库例如MySql的Navicat这种成熟的运维工具
  总而言之,MongDB的使用场景很大程度上可以对标关系型数据库,但是比较适合处理那些没有join、没有强一致性要求且表Schema会常变化的数据。
  通过以上讨论分析我们心中已经有了一个基本的选型框架指导,实际上在数据库选型时回答自己两个核心问题就好了:什么时候选用关系型数据库,什么时候选用非关系型数据库选用非关系型数据库的话,使用哪种非关系型数据库
  NoSQL数据库都是通过牺牲了ACID特性来获取更高性能的,假设表数据有很强的事务特性需求,那么这类数据是不适合放在非关系型数据库。此外,选用NoSQL数据库时也要根据公司技术栈框架、业务特性、运维成本等多方面考虑是否采纳。
  总结
  关系型数据库和NoSQL数据库的选型,往往需要考虑几个指标:数据量并发量实时性一致性要求读写分布和类型安全性运维成本
  常见软件系统数据库选型参考如下:中后台管理型系统如运营系统,数据量少,并发量小,首选关系型数据库。大流量系统如电商单品页,后台考虑选关系型数据库,前台考虑选内存型数据库。日志型系统原始数据考虑选列式数据库,日志搜索考虑选搜索引擎。搜索型系统例如站内搜索,非通用搜索,如商品搜索,后台考虑选关系型数据库,前台考虑选搜索引擎。事务型系统如库存,交易,记账,考虑选关系型数据库KV数据库(作为缓存)分布式事务。离线计算如大量数据分析,考虑选列式数据库或关系型数据库。实时计算如实时监控,可以考虑选内存型数据库或者列式数据库。
  设计实践中,要基于需求、业务驱动架构,无论选用RDBNoSQL,一定是以需求为导向,最终数据存储方案必然是各种权衡的综合性设计。
  说明:本文转自数据库存储选型经验总结

白毫银针白牡丹和寿眉后期都能陈化出枣香吗?感谢您提出的问题,让我们一起探讨茶知识,了解茶文化。先说结论,老寿眉饼比较容易陈化出枣香,其它基本很难陈化出这种独特风味。枣香的形成原理并不复杂。在寿眉进行压……农村老人说杀猪时,哪个小伙子肯去拉猪尾巴,那就是准女婿,为何农村老人说杀猪时,哪个小伙子肯去拉猪尾巴,那就是准女婿,为何会这么说呢?感谢邀请,非常有意思的一个问题。前两年去湘西老丈人家里过年,赶上了他们那边杀年猪,当时因为人手不够……山东人认可度高的白酒品牌有哪些?地道的山东人喜欢喝什么酒啊?山东人的白酒品牌很多的,每个地市都有自己的酒厂。相对来说,白酒更受中老年人偏爱。整理了部分省内的知名白酒品牌,遗漏之处麻烦大家补充。其中,耳熟能详的有潍坊景芝酒、淄博扳倒……你觉得哪款茅台酒,性价比最高?题主说的茅台,默认为飞天茅台(五星茅台),如果站在饮用的角度来看,普通飞天茅台,性价比其实不高,出厂价969元瓶,市场指导价1499元瓶,执行这个价格的渠道,要么常年缺货,要么……贵州有哪些不得错过的美食?贵州,在过去是贫困的代名词,有人总以为贵州吃不饱穿不暖,所以哪来什么好吃的!其实不然,贵州史上虽然穷,但是贵州人还是创出了很多让人馋涎欲滴的美食的!尤其在今天,贵州的经济已经开……冲上热搜!热依扎,终于迎来大水花,她值得大家好,我是余姐。相信许多人被热依扎的美貌刷屏了!恭喜热依扎!11月1日,第33届飞天奖颁奖典礼落下帷幕。热依扎凭借《山海情》水花一角,斩获优秀女演员奖……百亿亿次级的时代给我们带来什么?例举4项重大科学进步自从1946年2月14日美国宾夕法尼亚大学诞生了世界上第一台可编程序的通用计算机ENIAC,使这个星球上的人类的文明和生活方式进入了飞跃式变化的高速道。在这之前,谁能想到现在的……不想给中国添麻烦,卢卡申科称因遭制裁,最终缺席冬奥开幕式当北京冬奥会接连上演精彩比赛的同时,世界各国也在围绕着本届冬奥会展开一系列的明争暗斗,据俄媒本月2月9日发布的报道称,白俄罗斯总统卢卡申科在接受媒体采访时表示,他以及他的儿子,……国家补贴正式退场,2023年新能源车会否掀起激烈价格战?新年伊始,新能源汽车国家补贴政策正式退场。最后一波红利下,车企销量创新高。失去补贴,2023年的新能源车市场还有多大吸引力?国际车企巨头接连降价,本土车企或涨价或保价,2023……沧州优化营商环境再发力,取消一切不合理不必要的审批事项冀时客户端报道(河北台任亚栋李德财许丙路)记者从沧州市发改部门了解到,今年,沧州市将坚定不移抓改革、促开放,向两个市场两种资源要联动效应,以改革破解难题,以开放聚集资源,充分释……羊肉怎么做最好吃?羊头白水炖煮北京叫白水羊头,呼羊蹄,涮羊肉,烤羊肉串,烤腰子,烤羊宝,爆羊肉。请顿羊肉,羊肉烩面,羊肉苏肉切片涮羊肉,巴适〔呲牙〕孜然羊肉羊肉洗净,切成……拳头再次宣布改动TP,doinb又被针对了,4包2打法彻底作最近电竞行业的热度大家有目共睹,就目前这个情况来看,新赛季有很多战队将崛起,当然了,也有一些本来挺强的战队,经过一个转会期就跌落谷底的战队,这是很正常的,可见转会期的重要性,每……
技术无线测温技术在高压系统中的应用实例摘要:在金属冶炼的过程中,电力运输的损耗是一直存在的问题。随着信息技术的不断发展,各种电子设备也被逐渐应用到冶炼金属的高压系统中,由于电子设备的应用越来越广泛,导致了系统所承受……牛腩这样炖,有荤有素味道好,营养丰富且操作简单,新手也能完成11月吃什么吃在南通今天一大早又去跑步了,还是走昨天那条路线,这条小路沿着河边,一直往西延伸,足足有几里路长,期间路过几个小区,这些小区的人,也走这条路跑步,所以很热闹,……2023济宁太白湖牡丹花会4月1日开幕记者从市新闻办召开的惠民生促发展主题系列新闻发布会第3场上了解到,2023济宁太白湖牡丹花会由太白湖新区文化和旅游局主办,将于4月1日至5月20日在太白湖景区牡丹园举办。这是太……爱贪小便宜的煮妇,买了15元一斤的猪颈骨,被老公怼得哑口无言吃在南通今天一早与邻居去跑步,这次邻居带我走的是又一个新的路线从人民路市建路口往北走,一直走到伊顿公寓北面,有个新开的菜场,因为是新开的菜场,所以肉类,海鲜类,蔬菜类等都……库尔图瓦赢球能帮我们更好地迎接欧冠球迷骂维尼修斯令人遗憾直播吧2月19日讯今天凌晨,皇马20击败奥萨苏纳,赛后库尔图瓦接受了媒体采访。库尔图瓦说道:有球迷辱骂维尼修斯,大喊‘XX养的’,和‘去死吧’,这令人遗憾。有一些球迷很好……你爱吃的虾上线了,这样的做法你尝试过了吗,如没有不妨试下美食总是穷出不奇,每一天都有新奇招,新花样,没有做不到只有想不到。特别是那些美食爱好者,因为对他们来说去挖掘新的吃法是非常重要的,而且他们每天都会有很多的新花样,总是变着法来吃……华东,川渝,新疆,京津,我个人认为的国内四大旅游热点地区1。华东特指的是长三角地区上海的江南水乡究极城市版。苏州老城完整的水乡城市原貌。杭州西湖俯首可拾的历史传说。南京不远可追忆的前朝历史感。舟山的宗教与海,扬州的诗与运河,徽州的山……早上不知道吃什么,那就试试这个小面包,奶香四溢饱腹感强早上不知道吃什么,那就试试试这个小面包,奶香四溢饱腹感强每天早上都特别愁,不知道吃些什么、做些什么,每天早晨第一句,今天吃什么。太油的吃起来感觉太腻,想吃一些清淡的早点,……房车小讲堂如果说,小轿车拉近了人与人之间的距离,越野车拉近了人与自然的距离,那么房车则是把人与自然充分地融合在了一起。如今的汽车行业已经与人工智能、物联网、无人车等新技术融合,为现代的旅……做戚风蛋糕掌握这些关键细节,绵软细腻,蛋糕不回缩,一次成功三个鸡蛋做的戚风蛋糕松软细腻,蛋糕不开裂,不回缩有技巧!做蛋糕作为新手,最大的问题就是回缩开裂。明明方法都对,但不小心做出的蛋糕就是死面一团,出锅就回缩了,蛋糕内部特别湿……万能的菜肉馅,做包子和饺子都适合,这个菜肉包孩子吃一个准饱万能的菜肉馅,做包子和饺子都适合,这个菜肉包孩子吃一个准饱!中式早餐中,包子是很多人喜欢的食物,包子馅料种类特别丰富,可以做成糖包、奶黄包、菜包,肉包等。今天我推荐做个万……YYDS的女篮继续攻城拔寨,周琦重返老东家,威姆斯给我们留了大家好,我是璐璐!昨天在来深圳的路上,我看了中国女篮对阵波多黎各的全场比赛,如果要用辞藻来形容这场比赛的话,我个人认为用一气呵成,酣畅淋漓等都不能很完全地点评如今的这支中……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网