包含架构postgresql的词条

postgresql 建立索引

一、索引的类型:

在梅列等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都做网站 网站设计制作按需定制网站,公司网站建设,企业网站建设,品牌网站制作,营销型网站建设,外贸营销网站建设,梅列网站建设费用合理。

PostgreSQL提供了多种索引类型:B-Tree、Hash、GiST和GIN,由于它们使用了不同的算法,因此每种索引类型都有其适合的查询类型,缺省时,CREATE INDEX命令将创建B-Tree索引。

1. B-Tree:

CREATE TABLE test1 (

id integer,

content varchar

);

CREATE INDEX test1_id_index ON test1 (id);

B-Tree索引主要用于等于和范围查询,特别是当索引列包含操作符" 、=和"作为查询条件时,PostgreSQL的查询规划器都会考虑使用B-Tree索引。在使用BETWEEN、IN、IS NULL和IS NOT NULL的查询中,PostgreSQL也可以使用B-Tree索引。然而对于基于模式匹配操作符的查询,如LIKE、ILIKE、~和 ~*,仅当模式存在一个常量,且该常量位于模式字符串的开头时,如col LIKE 'foo%'或col ~ '^foo',索引才会生效,否则将会执行全表扫描,如:col LIKE '%bar'。

2. Hash:

CREATE INDEX name ON table USING hash (column);

散列(Hash)索引只能处理简单的等于比较。当索引列使用等于操作符进行比较时,查询规划器会考虑使用散列索引。

这里需要额外说明的是,PostgreSQL散列索引的性能不比B-Tree索引强,但是散列索引的尺寸和构造时间则更差。另外,由于散列索引操作目前没有记录WAL日志,因此一旦发生了数据库崩溃,我们将不得不用REINDEX重建散列索引。

3. GiST:

GiST索引不是一种单独的索引类型,而是一种架构,可以在该架构上实现很多不同的索引策略。从而可以使GiST索引根据不同的索引策略,而使用特定的操作符类型。

4. GIN:

GIN索引是反转索引,它可以处理包含多个键的值(比如数组)。与GiST类似,GIN同样支持用户定义的索引策略,从而可以使GIN索引根据不同的索引策略,而使用特定的操作符类型。作为示例,PostgreSQL的标准发布中包含了用于一维数组的GIN操作符类型,如:、=、等。

二、复合索引:

PostgreSQL中的索引可以定义在数据表的多个字段上,如:

CREATE TABLE test2 (

major int,

minor int,

name varchar

}

CREATE INDEX test2_mm_idx ON test2 (major, minor);

1. B-Tree类型的复合索引:

在B-Tree类型的复合索引中,该索引字段的任意子集均可用于查询条件,不过,只有当复合索引中的第一个索引字段(最左边)被包含其中时,才可以获得最高效率。

2. GiST类型的复合索引:

在GiST类型的复合索引中,只有当第一个索引字段被包含在查询条件中时,才能决定该查询会扫描多少索引数据,而其他索引字段上的条件只是会限制索引返回的条目。假如第一个索引字段上的大多数数据都有相同的键值,那么此时应用GiST索引就会比较低效。

3. GIN类型的复合索引:

与B-Tree和GiST索引不同的是,GIN复合索引不会受到查询条件中使用了哪些索引字段子集的影响,无论是哪种组合,都会得到相同的效率。

使用复合索引应该谨慎。在大多数情况下,单一字段上的索引就已经足够了,并且还节约时间和空间。除非表的使用模式非常固定,否则超过三个字段的索引几乎没什么用处。

三、组合多个索引:

PostgreSQL可以在查询时组合多个索引(包括同一索引的多次使用),来处理单个索引扫描不能实现的场合。与此同时,系统还可以在多个索引扫描之间组成AND和OR的条件。比如,一个类似WHERE x = 42 OR x = 47 OR x = 53 OR x = 99的查询,可以被分解成四个独立的基于x字段索引的扫描,每个扫描使用一个查询子句,之后再将这些扫描结果OR在一起并生成最终的结果。另外一个例子是,如果我们在x和y上分别存在独立的索引,那么一个类似WHERE x = 5 AND y = 6的查询,就会分别基于这两个字段的索引进行扫描,之后再将各自扫描的结果进行AND操作并生成最终的结果行。

为了组合多个索引,系统扫描每个需要的索引,然后在内存里组织一个BITMAP,它将给出索引扫描出的数据在数据表中的物理位置。然后,再根据查询的需要,把这些位图进行AND或者OR的操作并得出最终的BITMAP。最后,检索数据表并返回数据行。表的数据行是按照物理顺序进行访问的,因为这是位图的布局,这就意味着任何原来的索引的排序都将消失。如果查询中有ORDER BY子句,那么还将会有一个额外的排序步骤。因为这个原因,以及每个额外的索引扫描都会增加额外的时间,这样规划器有时候就会选择使用简单的索引扫描,即使有多个索引可用也会如此。

四、唯一索引:

CREATE UNIQUE INDEX name ON table (column [, ...]);

五、表达式索引:

表达式索引主要用于在查询条件中存在基于某个字段的函数或表达式的结果与其他值进行比较的情况,如:

SELECT * FROM test1 WHERE lower(col1) = 'value';

此时,如果我们仅仅是在col1字段上建立索引,那么该查询在执行时一定不会使用该索引,而是直接进行全表扫描。如果该表的数据量较大,那么执行该查询也将会需要很长时间。解决该问题的办法非常简单,在test1表上建立基于col1字段的表达式索引,如:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';

和上面的例子一样,尽管我们可能会为first_name和last_name分别创建独立索引,或者是基于这两个字段的复合索引,在执行该查询语句时,这些索引均不会被使用,该查询能够使用的索引只有我们下面创建的表达式索引。

CREATE INDEX people_names ON people ((first_name || ' ' || last_name));

CREATE INDEX命令的语法通常要求在索引表达式周围书写圆括弧,就像我们在第二个例子里显示的那样。如果表达式只是一个函数调用,那么可以省略,就像我们在第一个例子里显示的那样。

从索引维护的角度来看,索引表达式要相对低效一些,因为在插入数据或者更新数据的时候,都必须为该行计算表达式的结果,并将该结果直接存储到索引里。然而在查询时,PostgreSQL就会把它们看做WHERE idxcol = 'constant',因此搜索的速度等效于基于简单索引的查询。通常而言,我们只是应该在检索速度比插入和更新速度更重要的场景下使用表达式索引。

六、部分索引:

部分索引(partial index)是建立在一个表的子集上的索引,而该子集是由一个条件表达式定义的(叫做部分索引的谓词)。该索引只包含表中那些满足这个谓词的行。

由于不是在所有的情况下都需要更新索引,因此部分索引会提高数据插入和数据更新的效率。然而又因为部分索引比普通索引要小,因此可以更好的提高确实需要索引部分的查询效率。见以下三个示例:

1. 索引字段和谓词条件字段一致:

CREATE INDEX access_log_client_ip_ix ON access_log(client_ip)

WHERE NOT (client_ip inet '192.168.100.0' AND client_ip inet '192.168.100.255');

下面的查询将会用到该部分索引:

SELECT * FROM access_log WHERE url = '/index.html' AND client_ip = inet '212.78.10.32';

下面的查询将不会用该部分索引:

一个不能使用这个索引的查询可以是

SELECT * FROM access_log WHERE client_ip = inet '192.168.100.23';

2. 索引字段和谓词条件字段不一致:

PostgreSQL支持带任意谓词的部分索引,唯一的约束是谓词的字段也要来自于同样的数据表。注意,如果你希望你的查询语句能够用到部分索引,那么就要求该查询语句的条件部分必须和部分索引的谓词完全匹配。 准确说,只有在PostgreSQL能够识别出该查询的WHERE条件在数学上涵盖了该索引的谓词时,这个部分索引才能被用于该查询。

CREATE INDEX orders_unbilled_index ON orders(order_nr) WHERE billed is not true;

下面的查询一定会用到该部分索引:

SELECT * FROM orders WHERE billed is not true AND order_nr 10000;

那么对于如下查询呢?

SELECT * FROM orders WHERE billed is not true AND amount 5000.00;

这个查询将不像上面那个查询这么高效,毕竟查询的条件语句中没有用到索引字段,然而查询条件"billed is not true"却和部分索引的谓词完全匹配,因此PostgreSQL将扫描整个索引。这样只有在索引数据相对较少的情况下,该查询才能更有效一些。

下面的查询将不会用到部分索引。

SELECT * FROM orders WHERE order_nr = 3501;

3. 数据表子集的唯一性约束:

CREATE TABLE tests (

subject text,

target text,

success boolean,

...

);

CREATE UNIQUE INDEX tests_success_constraint ON tests(subject, target) WHERE success;

该部分索引将只会对success字段值为true的数据进行唯一性约束。在实际的应用中,如果成功的数据较少,而不成功的数据较多时,该实现方法将会非常高效。

七、检查索引的使用:

见以下四条建议:

1. 总是先运行ANALYZE。

该命令将会收集表中数值分布状况的统计。在估算一个查询返回的行数时需要这个信息,而规划器则需要这个行数以便给每个可能的查询规划赋予真实的开销值。如果缺乏任何真实的统计信息,那么就会使用一些缺省数值,这样肯定是不准确的。因此,如果还没有运行ANALYZE就检查一个索引的使用状况,那将会是一次失败的检查。

2. 使用真实的数据做实验。

用测试数据填充数据表,那么该表的索引将只会基于测试数据来评估该如何使用索引,而不是对所有的数据都如此使用。比如从100000行中选1000行,规划器可能会考虑使用索引,那么如果从100行中选1行就很难说也会使用索引了。因为100行的数据很可能是存储在一个磁盘页面中,然而没有任何查询规划能比通过顺序访问一个磁盘页面更加高效了。与此同时,在模拟测试数据时也要注意,如果这些数据是非常相似的数据、完全随机的数据,或按照排序顺序插入的数据,都会令统计信息偏离实际数据应该具有的特征。

3. 如果索引没有得到使用,那么在测试中强制它的使用也许会有些价值。有一些运行时参数可以关闭各种各样的查询规划。

4. 强制使用索引用法将会导致两种可能:一是系统选择是正确的,使用索引实际上并不合适,二是查询计划的开销计算并不能反映现实情况。这样你就应该对使用和不使用索引的查询进行计时,这个时候EXPLAIN ANALYZE命令就很有用了。

2019数据架构选型必读:1月数据库产品技术解析

本期目录

DB-Engines数据库排行榜

新闻快讯

一、RDBMS家族

二、NoSQL家族

三、NewSQL家族

四、时间序列

五、大数据生态圈

六、国产数据库概览

七、云数据库

八、推出dbaplus Newsletter的想法

九、感谢名单

为方便阅读、重点呈现,本期Newsletter(2019年1月)将对各个板块的内容进行精简。需要阅读全文的同学可点击文末 【阅读原文】 或登录

进行下载。

DB-Engines数据库排行榜

以下取自2019年1月的数据,具体信息可以参考,数据仅供参考。

DB-Engines排名的数据依据5个不同的因素:

新闻快讯

1、2018年9月24日,微软公布了SQL Server2019预览版,SQL Server 2019将结合Spark创建统一数据平台。

2、2018年10月5日,ElasticSearch在美国纽约证券交易所上市。

3、亚马逊放弃甲骨文数据库软件,导致最大仓库之一在黄金时段宕机。受此消息影响,亚马逊盘前股价小幅跳水,跌超2%。

4、2018年10月31日,Percona发布了Percona Server 8.0 RC版本,发布对MongoDB 4.0的支持,发布对XtraBackup测试第二个版本。

5、2018年10月31日,Gartner陆续发布了2018年的数据库系列报告,包括《数据库魔力象限》、《数据库核心能力》以及《数据库推荐报告》。

今年的总上榜数据库产品达到了5家,分别来自:阿里云,华为,巨杉数据库,腾讯云,星环 科技 。其中阿里云和巨杉数据库已经连续两年入选。

6、2018年11月初,Neo4j宣布完成E轮8000万美元融资。11月15日,Neo4j宣布企业版彻底闭源:

7、2019年1月8日,阿里巴巴以1.033亿美元(9000万欧元)的价格收购了Apache Flink商业公司DataArtisans。

8、2019年1月11日早间消息,亚马逊宣布推出云数据库软件,亚马逊和MongoDB将会直接竞争。

RDBMS家族

Oracle 发布18.3版本

2018年7月,Oracle Database 18.3通用版开始提供下载。我们可以将Oracle Database 18c视为采用之前发布模式的Oracle Database 12c第2版的第一个补丁集。未来,客户将不再需要等待多年才能用上最新版Oracle数据库,而是每年都可以期待新数据库特性和增强。Database 19c将于2019年Q1率先在Oracle cloud上发布云版本。

Oracle Database 18c及19c部分关键功能:

1、性能

2、多租户,大量功能增强及改进,大幅节省成本和提高敏捷性

3、高可用

4、数据仓库和大数据

MySQL发布8.0.13版本

1、账户管理

经过配置,修改密码时,必须带上原密码。在之前的版本,用户登录之后,就可以修改自己的密码。这种方式存在一定安全风险。比如用户登录上数据库后,中途离开一段时间,那么非法用户可能会修改密码。由参数password_require_current控制。

2、配置

Innodb表必须有主键。在用户没有指定主键时,系统会生成一个默认的主键。但是在主从复制的场景下,默认的主键,会对丛库应用速度带来致命的影响。如果设置sql_require_primary_key,那么数据库会强制用户在创建表、修改表时,加上主键。

3、字段默认值

BLOB、TEXT、GEOMETRY和JSON字段可以指定默认值了。

4、优化器

1)Skip Scan

非前缀索引也可以用了。

之前的版本,任何没有带上f1字段的查询,都没法使用索引。在新的版本中,它可以忽略前面的字段,让这个查询使用到索引。其实现原理就是把(f1 = 1 AND f2 40) 和(f1 = 2 AND f2 40)的查询结果合并。

2)函数索引

之前版本只能基于某个列或者多个列加索引,但是不允许在上面做计算,如今这个限制消除了。

5、SQL语法

GROUP BY ASC和GROUP BY DESC语法已经被废弃,要想达到类似的效果,请使用GROUP BY ORDER BY ASC和GROUP BY ORDER BY DESC。

6、功能变化

1)设置用户变量,请使用SET语句

如下类型语句将要被废弃SELECT @var, @var:=@var+1。

2)新增innodb_fsync_threshold

该变量是控制文件刷新到磁盘的速率,防止磁盘在短时间内饱和。

3)新增会话级临时表空间

在以往的版本中,当执行SQL时,产生的临时表都在全局表空间ibtmp1中,及时执行结束,临时表被释放,空间不会被回收。新版本中,会为session从临时表空间池中分配一个临时表空间,当连接断开时,临时表空间的磁盘空间被回收。

4)在线切换Group Replication的状态

5)新增了group_replication_member_expel_timeout

之前,如果某个节点被怀疑有问题,在5秒检测期结束之后,那么就直接被驱逐出这个集群。即使该节点恢复正常时,也不会再被加入集群。那么,瞬时的故障,会把某些节点驱逐出集群。

group_replication_member_expel_timeout让管理员能更好的依据自身的场景,做出最合适的配置(建议配置时间小于一个小时)。

MariaDB 10.3版本功能展示

1、MariaDB 10.3支持update多表ORDER BY and LIMIT

1)update连表更新,limit语句

update t1 join t2 on t1.id=t2.id set t1.name='hechunyang' limit 3;

MySQL 8.0直接报错

MariaDB 10.3更新成功

2)update连表更新,ORDER BY and LIMIT语句

update t1 join t2 on t1.id=t2.id set t1.name='HEchunyang' order by t1.id DESC limit 3;

MySQL 8.0直接报错

MariaDB 10.3更新成功

参考:

2、MariaDB10.3增补AliSQL补丁——安全执行Online DDL

Online DDL从名字上看很容易误导新手,以为不论什么情况,修改表结构都不会锁表,理想很丰满,现实很骨感,注意这个坑!

有以下两种情况执行DDL操作会锁表的,Waiting for table metadata lock(元数据表锁):

针对第二种情况,MariaDB10.3增补AliSQL补丁-DDL FAST FAIL,让其DDL操作快速失败。

例:

如果线上有某个慢SQL对该表进行操作,可以使用WAIT n(以秒为单位设置等待)或NOWAIT在语句中显式设置锁等待超时,在这种情况下,如果无法获取锁,语句将立即失败。 WAIT 0相当于NOWAIT。

参考:

3、MariaDB Window Functions窗口函数分组取TOP N记录

窗口函数在MariaDB10.2版本里实现,其简化了复杂SQL的撰写,提高了可读性。

参考:

Percona Server发布8.0 GA版本

2018年12月21日,Percona发布了Percona Server 8.0 GA版本。

在支持MySQL8.0社区的基础版上,Percona Server for MySQL 8.0版本中带来了许多新功能:

1、安全性和合规性

2、性能和可扩展性

3、可观察性和可用性

Percona Server for MySQL 8.0中将要被废用功能:

Percona Server for MySQL 8.0中删除的功能:

RocksDB发布V5.17.2版本

2018年10月24日,RocksDB发布V5.17.2版本。

RocksDB是Facebook在LevelDB基础上用C++写的高效内嵌式K/V存储引擎。相比LevelDB,RocksDB提供了Column-Family,TTL,Transaction,Merge等方面的支持。目前MyRocks,TiKV等底层的存储都是基于RocksDB来构建。

PostgreSQL发布11版本

2018年10月18日,PostgreSQL 11发布。

1、PostgreSQL 11的重大增强

2、PostgreSQL 插件动态

1)分布式插件citus发布 8.1

citus是PostgreSQL的一款sharding插件,目前国内苏宁、铁总、探探有较大量使用案例。

2)地理信息插件postgis发布2.5.1

PostGIS是专业的时空数据库插件,在测绘、航天、气象、地震、国土资源、地图等时空专业领域应用广泛。同时在互联网行业也得到了对GIS有性能、功能深度要求的客户青睐,比如共享出行、外卖等客户。

3)时序插件timescale发布1.1.1

timescale是PostgreSQL的一款时序数据库插件,在IoT行业中有非常好的应用。github star数目前有5000多,是一个非常火爆的插件。

4)流计算插件 pipelinedb 正式插件化

Pipelinedb是PostgreSQL的一款流计算插件,使用这个创建可以对高速写入的数据进行实时根据定义的聚合规则进行聚合(支持概率计算),实时根据定义的规则触发事件(支持事件处理函数的自定义)。可用于IoT,监控,FEED实时计算等场景。

3、PostgreSQL衍生开源产品动态

1)agensgraph发布 2.0.0版本

agensgraph是兼容PostgreSQL、opencypher的专业图数据库,适合图式关系的管理。

2)gpdb发布5.15

gpdb是兼容PostgreSQL的mpp数据库,适合OLAP场景。近两年,gpdb一直在追赶PostgreSQL的社区版本,预计很快会追上10的PostgreSQL,在TP方面的性能也会得到显著提升。

3)antdb发布3.2

antdb是以Postgres-XC为基础开发的一款PostgreSQL sharding数据库,亚信主导开发,开源,目前主要服务于亚信自有客户。

4)迁移工具MTK发布52版本

MTK是EDB提供的可以将Oracle、PostgreSQL、MySQL、MSSQL、Sybase数据库迁移到PostgreSQL, PPAS的产品,迁移速度可以达到100万行/s以上。

DB2发布 11.1.4.4版本

DB2最新发布Mod Pack 4 and Fix Pack 4,包含以下几方面的改动及增强:

1、性能

2、高可用

3、管理视图

4、应用开发方面

5、联邦功能

6、pureScale

NoSQL家族

Redis发布5.0.3版本

MongoDB升级更新MongoDB Mobile和MongoDB Stitch

2018年11月21日,MongoDB升级更新MongoDB Mobile和MongoDB Stitch,助力开发人员提升工作效率。

MongoDB 公司日前发布了多项新产品功能,旨在更好地帮助开发人员在世界各地管理数据。通过利用存储在移动设备和后台数据库的数据之间的实时、自动的同步特性,MongoDB Mobile通用版本助力开发人员构建更快捷、反应更迅速的应用程序。此前,这只能通过在移动应用内部安装一个可供选择或限定功能的数据库来实现。

MongoDB Mobile在为客户提供随处运行的自由度方面更进了一步。用户在iOS和安卓终端设备上可拥有MongoDB所有功能,将网络边界扩展到其物联网资产范畴。应用系统还可以使用MongoDB Stitch的软件开发包访问移动客户端或后台数据,帮助开发人员通过他们希望的任意方式查询移动终端数据和物联网数据,包括本地读写、本地JSON存储、索引和聚合。通过Stitch移动同步功能(现可提供beta版),用户可以自动对保存在本地的数据以及后台数据库的数据进行同步。

本期新秀:Cassandra发布3.11.3版本

2018年8月11日,Cassandra发布正式版3.11.3。

Apache Cassandra是一款开源分布式NoSQL数据库系统,使用了基于Google BigTable的数据模型,与面向行(row)的传统关系型数据库或键值存储key-value数据库不同,Cassandra使用的是宽列存储模型(Wide Column Stores)。与BigTable和其模仿者HBase不同,数据并不存储在分布式文件系统如GFS或HDFS中,而是直接存于本地。

Cassandra的系统架构与Amazon DynamoDB类似,是基于一致性哈希的完全P2P架构,每行数据通过哈希来决定应该存在哪个或哪些节点中。集群没有master的概念,所有节点都是同样的角色,彻底避免了整个系统的单点问题导致的不稳定性,集群间的状态同步通过Gossip协议来进行P2P的通信。

3.11.3版本的一些bug fix和改进:

NewSQL家族

TiDB 发布2.1.2版本

2018 年 12 月 22 日,TiDB 发布 2.1.2 版,TiDB-Ansible 相应发布 2.1.2 版本。该版本在 2.1.1 版的基础上,对系统兼容性、稳定性做出了改进。

TiDB 是一款定位于在线事务处理/在线分析处理( HTAP: Hybrid Transactional/Analytical Processing)的融合型数据库产品。除了底层的 RocksDB 存储引擎之外,分布式SQL层、分布式KV存储引擎(TiKV)完全自主设计和研发。

TiDB 完全开源,兼容MySQL协议和语法,可以简单理解为一个可以无限水平扩展的MySQL,并且提供分布式事务、跨节点 JOIN、吞吐和存储容量水平扩展、故障自恢复、高可用等优异的特性;对业务没有任何侵入性,简化开发,利于维护和平滑迁移。

TiDB:

PD:

TiKV:

Tools:

1)TiDB-Lightning

2)TiDB-Binlog

EsgynDB发布R2.5版本

2018年12月22日,EsgynDB R2.5版本正式发布。

作为企业级产品,EsgynDB 2.5向前迈进了一大步,它拥有以下功能和改进:

CockroachDB发布2.1版本

2018年10月30日,CockroachDB正式发布2.1版本,其新增特性如下:

新增企业级特性:

新增SQL特性:

新增内核特性:

Admin UI增强:

时间序列

本期新秀:TimescaleDB发布1.0版本

10月底,TimescaleDB 1.0宣布正式推出,官方表示该版本已可用于生产环境,支持完整SQL和扩展。

TimescaleDB是基于PostgreSQL数据库开发的一款时序数据库,以插件化的形式打包提供,随着PostgreSQL的版本升级而升级,不会因为另立分支带来麻烦。

TimescaleDB架构:

数据自动按时间和空间分片(chunk)

更新亮点:

大数据生态圈

Hadoop发布2.9.2版本

2018年11月中旬,Hadoop在2.9分支上发布了新的2.9.2版本,该版本进行了204个大大小小的变更,主要变更如下:

Greenplum 发布5.15版本

Greenplum最新的5.15版本中发布了流式数据加载工具。

该版本中的Greenplum Streem Server组件已经集成了Kafka流式加载功能,并通过了Confluent官方的集成认证,其支持的主要功能如下:

国产数据库概览

K-DB发布数据库一体机版

2018年11月7日,K-DB发布了数据库一体机版。该版本更新情况如下:

OceanBase迁移服务发布1.0版本

1月4日,OceanBase 正式发布OMS迁移服务1.0版本。

以下内容包含 OceanBase 迁移服务的重要特性和功能:

SequoiaDB发布3.0.1新版本

1、架构

1)完整计算存储分离架构,兼容MySQL协议、语法

计算存储分离体系以松耦合的方式将计算与存储层分别部署,通过标准接口或插件对各个模块和组件进行无缝替换,在计算层与存储层均可实现自由的弹性伸缩。

SequoiaDB巨杉数据库“计算-存储分离”架构详细示意

用户可以根据自身业务特征选择面向交易的SQL解析器(例如MySQL或PGSQL)或面向统计分析的执行引擎(例如SparkSQL)。众所周知,使用不同的SQL优化与执行方式,数据库的访问性能可能会存在上千上万倍的差距。计算存储分离的核心思想便是在数据存储层面进行一体化存储,在计算层面则利用每种执行引擎的特点针对不同业务场景进行选择和优化,用户可以在存储层进行逻辑与物理的隔离,将面向高频交易的前端业务与面向高吞吐量的统计分析使用不同的硬件进行存储,确保在多类型数据访问时互不干扰,以真正达到生产环境可用的多租户与HTAP能力。

2、其他更新信息

1)接口变更:

2)主要特性:

云数据库

本期新秀:腾讯发布数据库CynosDB,开启公测

1、News

1)腾讯云数据库MySQL2018年重大更新:

2)腾讯云数据库MongoDB2018年重大更新:

3)腾讯云数据库Redis/CKV+2018年重大更新:

4)腾讯云数据库CTSDB2018年重大更新:

2、Redis 4.0集群版商业化上线

2018年10月,腾讯云数据库Redis 4.0集群版完成邀测、公测、商业化三个迭代,在广州、上海、北京正式全量商业化上线。

产品特性:

使用场景:

官网文档:

3、腾讯自研数据库CynosDB发布,开启公测

2018年11月22日,腾讯云召开新一代自研数据库CynosDB发布会,业界第一款全面兼容市面上两大最主流的开源数据库MySQL和PostgreSQL的高性能企业级分布式云数据库。

本期新秀:京东云DRDS发布1.0版本

12月24日,京东云分布式关系型数据库DRDS正式发布1.0版本。

DRDS是京东云精心自研的数据库中间件产品,获得了2018年 ”可信云技术创新奖”。DRDS可实现海量数据下的自动分库分表,具有高性能,分布式,弹性升级,兼容MySQL等优点,适用于高并发、大规模数据的在线交易, 历史 数据查询,自动数据分片等业务场景,历经多次618,双十一的考验,已经在京东集团内大规模使用。

京东云DRDS产品有以下主要特性

1)自动分库分表

通过简单的定义即可自动实现分库分表,将数据实际存放在多个MySQL实例的数据库中,但呈现给应用程序的依旧是一张表,对业务透明,应用程序几乎无需改动,实现了对数据库存储和处理能力的水平扩展。

2)分布式架构

基于分布式架构的集群方案,多个对等节点同时对外提供服务,不但可有效规避服务的单点故障,而且更加容易扩展。

3)超强性能

具有极高的处理能力,双节点即可支持数万QPS,满足用户超大规模处理能力的需求。

4)兼容MySQL

兼容绝大部分MySQL语法,包括MySQL语法、数据类型、索引、常用函数、排序、关联等DDL,DML语句,使用成本低。

参考链接:

RadonDB发布1.0.3版本

2018年12月26日,MyNewSQL领域的RadonDB云数据库发布1.0.3版本。

推出dbaplus Newsletter的想法

dbaplus Newsletter旨在向广大技术爱好者提供数据库行业的最新技术发展趋势,为社区的技术发展提供一个统一的发声平台。为此,我们策划了RDBMS、NoSQL、NewSQL、时间序列、大数据生态圈、国产数据库、云数据库等几个版块。

我们不以商业宣传为目的,不接受任何商业广告宣传,严格审查信息源的可信度和准确性,力争为大家提供一个纯净的技术学习环境,欢迎大家监督指正。

至于Newsletter发布的周期,目前计划是每三个月左右会做一次跟进, 下期计划时间是2019年4月14日~4月25日, 如果有相关的信息提供请发送至邮箱:newsletter@dbaplus.cn

感谢名单

最后要感谢那些提供宝贵信息和建议的专家朋友,排名不分先后。

往期回顾:

↓↓别忘了点这里下载 2019年1月 完整版Newsletter 哦~

「PostgreSQL架构」为什么RDBMS是分布式数据库的未来

大约10年前,我加入了Amazon Web Services,在那里我第一次看到了在分布式系统中进行权衡的重要性。在大学里,我已经了解了一致性和可用性之间的权衡(CAP定理),但实际上,频谱要比这深得多。任何设计决策都可能涉及延迟,并发性,可伸缩性,耐用性,可维护性,功能性,操作简便性以及系统其他方面之间的权衡,而这些权衡会对应用程序的功能和用户体验产生有意义的影响,并且即使是业务本身的有效性。

也许在权衡需求最明显的分布式系统中最具挑战性的问题是构建分布式数据库。当应用程序开始需要可以在许多服务器上扩展的数据库时,数据库开发人员开始做出极端的权衡。为了在许多节点上实现可伸缩性,分布式键值存储(NoSQL)抛弃了传统关系数据库管理系统(RDBMS)提供的丰富功能集,包括SQL,联接,外键和ACID保证。由于每个人都想要可伸缩性,因此RDBMS消失只是时间问题,对吗?实际上,关系数据库继续主导着数据库领域。这就是为什么:

在分布式系统(或任何系统)中进行权衡时,要考虑的最重要方面是开发成本。

数据库软件所做出的权衡将对应用程序的开发成本产生重大影响。在高级应用程序中处理需要可用性,可靠性和性能的数据是一个固有地需要解决的问题。成功解决每个小问题所需的工时数量可能很大。幸运的是,数据库可以解决许多这些子问题,但是数据库开发人员也面临成本问题。实际上,要使数据库足以满足大多数应用程序的功能,保证和性能,就需要数十年的时间。那就是建立关系数据库如PostgreSQL和MySQL的地方。

在Citus Data,我们从不同角度解决了数据库可伸缩性的需求。我和我的团队在过去的几年中花费了很多时间将已建立的RDBMS转换为分布式数据库,而又不会失去其强大功能或从基础项目中分叉。通过这样做,我们发现RDBMS是构建分布式数据库的理想基础。

使RDBMS对开发应用程序(尤其是开源RDBMS,尤其是云RDBMS)如此吸引人的原因在于,您可以有效地利用数十年来对RDBMS进行的工程投资,并利用这些RDBMS功能。您的应用,降低了开发成本。

RDBMS为您提供:

这些功能几乎对任何非平凡的应用都很重要,但是要花很长时间才能开发。另一方面,某些应用程序的工作量对于单台计算机来说太过苛刻,因此需要水平可伸缩性。

许多新的分布式数据库正在开发中,并且正在分布式键值存储(“ NewSQL”)之上实现RDBMS功能,例如SQL。尽管这些较新的数据库可以使用多台计算机的资源,但是在SQL支持,查询性能,并发性,索引,外键,事务,存储过程等方面,它们仍远未建立在关系数据库系统上。您遇到许多要在应用程序中解决的复杂问题。

许多大型互联网公司采用的替代方法是RDBMS的手动,应用程序层分片(通常是PostgreSQL或MySQL)。手动分片意味着有许多RDBMS节点,并且应用程序会根据某种条件(例如,用户ID)决定连接到哪个节点。应用程序本身负责如何处理数据放置,架构更改,查询多个节点,复制表等,因此,如果执行手动分片,最终将在应用程序中实现自己的分布式数据库,这可能甚至更多。昂贵。

幸运的是,有一种方法可以解决开发成本难题。

PostgreSQL已有数十年的发展 历史 ,其令人难以置信的重点是代码质量,模块化和可扩展性。这种可扩展性提供了一个独特的机会:无需分叉就可以将PostgreSQL转换为分布式数据库。这就是我们构建Citus的方式。

大约5年前,当我加入一家名为Citus Data的初创公司时,我为在竞争激烈的市场中建立高级分布式数据库而无任何现有基础架构,品牌知名度,进入市场,资本或大量工程师的挑战感到沮丧 。 仅开发成本就似乎是无法克服的。 但是,就像应用程序开发人员利用PostgreSQL来构建复杂的应用程序一样,我们利用PostgreSQL来构建……分布式PostgreSQL。

我们创建了Citus,这是开源的PostgreSQL扩展,而不是从头开始创建分布式数据库,它以提供水平扩展的方式透明地分发表和查询,但是应用程序开发人员需要具备所有PostgreSQL功能才能成功。

通过使用在计划查询时Postgres调用的内部挂钩,我们能够将分布式表的概念添加到Postgres。

分布式表的分片存储在具有所有现有功能的常规PostgreSQL节点中,Citus发送常规SQL命令以查询分片,然后合并结果。 我们还添加了参考表的概念,该参考表可在所有节点上复制,因此可以通过任何列与分布式表连接。 通过进一步增加对分布式事务,查询路由,分布式子查询和CTE,序列,更新等的支持,我们达到了最先进的PostgreSQL功能可以使用的规模,但现在已经可以大规模使用。

Citus相对来说还很年轻,但是已经建立在PostgreSQL之上,已经成为世界上最先进的分布式数据库之一。与PostgreSQL的完整功能集相比,这令人毛骨悚然,还有许多工作要做,Citus现在提供的功能及其扩展方式使其在分布式数据库环境中具有很大的独特性。许多当前的Citus用户最初使用Postgres中的许多高级功能在单节点PostgreSQL服务器上建立业务,然后仅用几周的开发工作就迁移到Citus,以将其数据库模式转换为分布式表和引用表。对于任何其他数据库,从单节点数据库到分布式数据库的这种迁移可能要花费数月甚至数年的时间。

像PostgreSQL这样的RDBMS具有几乎无限的功能和成熟的SQL引擎,可让您以多种方式查询数据。当然,这些功能只有在速度很快时才对应用程序有用。幸运的是,PostgreSQL很快,并且通过诸如实时查询编译之类的新功能不断提高,但是当您拥有大量数据或流量以至于一台机器速度太慢时,那些强大的功能就不再那么有用了……除非您可以结合许多计算机的计算能力。这就是功能成为超级大国的地方。

通过采用PostgreSQL功能并进行扩展,Citus具有许多超级功能,这些功能使用户可以将数据库扩展到任意大小,同时保持高性能及其所有功能。

尽管大多数这些功能对于开发需要扩展的复杂应用程序来说似乎都是必不可少的,但并不是所有分布式数据库都支持它们。下面我们根据公开提供的文档对一些流行的分布式数据库进行比较。

与在分布式数据库中拥有超级功能相比,更重要的是能够组合数据库超级功能来解决复杂的用例。

由于支持查询路由,参考表,索引,分布式事务和存储过程,因此即使最先进的多租户OLTP应用程序(例如Copper)也可以使用Citus扩展到单个PostgreSQL节点之外,而不会在应用程序中做出任何牺牲。

如果将子查询下推与并行的分布式DML结合使用,则可以在数据库内部转换大量数据。一个常见的示例是使用INSERT…SELECT构建汇总表,该表可以并行化以适应任何类型的数据量。结合通过COPY,索引,联接和分区进行的批量加载,您将拥有一个非常适合时间序列数据和实时分析应用程序(如Algolia仪表板)的数据库。

正如Microsoft的Min Wei在谈到Microsoft如何使用Citus和PostgreSQL分析Windows数据时指出的那样:Citus使您能够使用分布式OLTP解决大规模OLAP问题。

Citus与其他分布式数据库有些不同,后者通常是从头开始开发的。 Citus没有引入PostgreSQL中尚未提供的任何功能。 Citus数据库以满足需要扩展的用例的方式扩展了现有功能。重要的是,大多数PostgreSQL功能已经针对各种用例进行了数十年的开发和测试,而当今用例的功能要求最终并没有太大不同;主要是数据的规模和大小不同。因此,在构建现代应用程序时,基于世界上最先进的开源RDBMS(PostgreSQL!)构建的分布式数据库(如Citus)可以成为您的武器库中最强大的工具。

原文:

本文:

讨论:请加入知识星球或者微信圈子【首席架构师圈】


网页标题:包含架构postgresql的词条
本文网址:http://csdahua.cn/article/dsdppsj.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流