高性能 NoSQL

浅殇忆流年 2019-03-20 17:33:41 ⋅ 725 阅读

关系数据库经过几十年的发展,已经非常成熟,但同时也存在不足:

  • 存储的是行记录,无法存储数据结构

例如微博的关注关系,“我关注的人”是一个用户ID列表,使用关系数据库只能将列表拆成多行,然后查询组装,无法直接存储一个列表。

  • schema 扩展不方便

表结构是强约束的,业务变更时扩充很麻烦。

  • 在大数据场景下 I/O 较高

如果对大数据量的表进行统计运算,I/O会很高,因为即使只针对某列进行运算,也需要将整行数据读入内存。

  • 搜索功能较弱

全文搜索只能使用 Like 进行整表扫描,性能非常低。

针对这些不足,产生了不同的 NoSQL 解决方案,在某些场景下比关系数据库更有优势,但同时也牺牲了某些特性,所以不能片面的迷信某种方案,应将其作为 SQL 的有利补充。

NoSQL != No SQL,而是:

NoSQL = Not Only SQL

典型的 NoSQL 方案分为4类:

  1. K-V 存储

解决存储数据结构的问题,以 Redis 为代表。

  1. 文档数据库

解决 schema 强约束的问题,以 MongoDB 为代表。

  1. 列式数据库

解决大数据下 I/O 问题,以 HBASE 为代表。

  1. 全文搜索引擎

解决全文搜索性能问题,以 ElasticSearch 为代表。

1. K-V 存储

Redis 是典型,其 value 是具体的数据结构,包括 string, hash, list, set, sorted set, bitmap, hyperloglog,常被称为数据结构服务器。

以 list 为例:

LPOP key 是移除并返回队列左边的第一个元素。

如果用关系数据库就比较麻烦了,需要操作:

  • 为每条数据添加 位置编号,否则没法判断哪条数据是第一条。不能用ID作为位置编号,因为会往列表头部插入数据。

  • 查询出第一条数据。

  • 删除第一条数据。

  • 更新从第二条开始的所有数据的位置编号。

Redis 的缺点主要体现在不支持完成的ACID事务,只能保证隔离性和一致性,无法保证原子性和持久性。

2. 文档数据库

最大的特点是 no-schema,无需在使用前定义字段,读取一个不存在的字段也不会导致语法错误。

特点:

  1. 新增字段简单。

  2. 兼容历史数据,即使没有新增字段,不会出错。

  3. 很容易存储复杂数据,使用 JSON 描述数据,比关系数据库方便得多。

以电商为例,不同商品的属性差异很大,如冰箱和电脑,这种差异性在关系数据库中会有很大的麻烦,而使用文档数据库则非常方便。

文档数据库的主要缺点:

  1. 不支持事务

  2. 无法实现 join 操作

3. 列式数据库

关系数据库是按行来存储的,列式数据库是按照列来存储数据。

按行存储的优势:

  • 同时读取多个列时效率高,一次磁盘操作就把一行数据中的各列都读取到内存了。

  • 能够一次完成对一行中多个列的写操作,保证了对行数据写操作的原子性和一致性;如果使用列式存储,可能出现多次写操作,因为这些列都不在一起存储。

在某些场景下,这些优势就成为劣势了,例如,计算超重人员的数据,只需要读取体重这一列进行统计即可,但行式存储会将整行数据读取到内存中,很浪费。

而列式存储中,只需要读取体重这列的数据即可,I/O 将大大减少。

除了节省I/O,列式存储还有更高的压缩比,可以节省存储空间。普通行式数据库的压缩比在 3:1 到 5:1 左右,列式数据库在 8:1 到 30:1,因为单个列的数据相似度更高。

列式存储的随机写效率远低于行式存储,因为行式存储时同一行多个列都存储在连续空间中,而列式存储将不同列存储在不连续的空间。

一般将列式存储应用在离线大数据分析统计场景,因为这时主要针对部分列进行操作,而且数据写入后无须更新。

4. 全文搜索引擎

关系数据库通过索引进行快速查询,但在全文搜索的情景下,索引就不够了,因为:

  • 全文搜索的条件可以随意排列组合,索引很难满足。

  • 全文搜索的模糊匹配方式,索引无法满足,只能用 like,效率极低。

假设有一个交友网站,信息表如下:

  • 美女1:我要找在上海做PHP的哥哥。

需要匹配性别、地点、语言列。

  • 美女2:我要找北京爱旅游的哥哥。

需要匹配性别、地点、爱好列。

实际搜索中,各种排列组合非常多,关系数据库很难支持。

全文搜索引擎是使用倒排索引技术,建立单词到文档的索引,例如上面的表信息建立倒排索引:

所以特别适合根据关键词来查询文档内容。

小结

上面介绍了几种典型的NoSQL方案,及各自的适用场景和特点,您可以根据实际需求进行选择。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    MixGo V1.0 发布,混合型高性能 Go 框架

    Mix Go 是什么 Mix Go 是混合型高性能 Go 框架,该框架改造整合了 gin, logrus, gorm, go-redis, jwt

    Netty单机百万连接及高性能优化

    关于netty的学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,多读读会发现很多高性能的优化点。

    Julia 1.6.0 发布,高性能动态高级编程语言

    Julia 1.6.0 现已发布。Julia 是一个高性能动态高级编程语言。其拥有丰富的函数库,提供了数字精度、精致的增幅器和分布式并行运行方式。核心函数库等大多数库由 Julia 编写,但也用成熟

    【开源资讯】GraalVM 20.3 发布,高性能跨语言虚拟机

    GraalVM 20.3 已发布。GraalVM 是 Oracle 打造的高性能跨语言虚拟机,支持运行 JavaScript、Python 3、Ruby、R

    GraalVM 社区版 21.0.0 发布,高性能跨语言虚拟机

    GraalVM 社区版 21.0.0 已发布。GraalVM 是 Oracle 打造的高性能跨语言虚拟机,支持运行 JavaScript、Python 3

    高性能缓存架构设计(超实用)

    缓存虽然能够大大减轻存储系统的压力,但同时也给架构引入了更多复杂性。

    MySql实战篇:建立高性能的Mysql技巧

    体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库......

    gRPC 1.34.0 发布,高性能 RPC 框架

    gRPC Core 的 1.34.0 版已经发布,详细的 gRPC 文档请参阅 grpc.io,此版本包含改进和一些错误修复,下面列出了本次更新的一些重点内容: Core 使用环境变量“ GRPC_XDS_EXPERIMENTAL_S...

    pgagroal 1.1.0 发布,高性能数据库连接池

    pgagroal 1.1.0 已经发布。 pgagroal 是一个 PostgreSQL 的原生协议连接池,具有高性能、 限制用户和数据库连接的数量、支持预填充、删除贡献连接、连接验证等特点。 新特性 支持重新加载配置 跟踪 prep...

    gRPC 1.35.0 发布,高性能 RPC 框架

    gRPC Core 的 1.35.0 已经发布,详细的 gRPC 文档请参阅 grpc.io,此版本包含改进和一些错误修复,下面列出了本次更新的一些重点内容: Core Backport “修复 zlib + macOS 中的隐式声明...

    RediSearch 2.0.6 发布,高性能全文搜索引擎

    RediSearch 2.0.6 现已发布,这是 2.0 版的维护版本,更新紧急程度较低。具体更新内容如下: Details: #1774 MINPREFIX 和 MAXEXPANSION 可以在运行时更改 #1689&nb...

    RediSearch 1.6.15 发布,高性能全文搜索引擎

    RediSearch 1.6.15 现已发布,这是1.6 版的维护版本,更新紧急程度较低。具体更新内容如下: Details: Minor enhancements: #1225 允许对数字字段进行科学的数字表示。 #1...

    gRPC 1.36.0 发布,高性能 RPC 框架

    gRPC 1.36.0 版本已发布。详细的 gRPC 文档请参阅 grpc.io,此版本包含一些改进和错误修复,下面列出了本次更新的一些重点内容: Core 删除在 c-ares DNS 解析器中设置的不必要的 pollset set...

    Nginx服务器高性能优化--轻松实现10万并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文章:https://www.cn...

    GraalVM 20.2发布,一款高性能跨语言虚拟机

    GraalVM 消除了编程语言之间的隔离,并支持共享运行时的互操作性。

    【开源推荐】基于 Go 语言的轻量级高性能日志库 logit使用及测评

    logit 是一个简单易用并且是基于级别控制的日志库,可以应用于所有的 GoLang 应用程序中。

    给大家分享一款开源的高性能api网关

    https://www.toutiao.com/i6890014207987679755 在当前的互联网环境下,尤其是移动互联网的时代,用户通过手机APP可访问很多应用,作为应用的服务部分面对日益增多的客户,为了保证用户功能和体验,必然需要采用分...

    Node实战篇:Express--jade模板引擎(七)

    Jade(Pug) — Node Template Engine,一个高性能的模板引擎,专为 Node 而做......

    可承载10亿级别的高性能微服务 API 网关APIOAK 0.4.0 发布(附源码)

    重构了动态负载均衡、路由解析器等内核模块并提供了强大易用的控制台管理