本节描述如何在数据库中计算查询。在ClustrixDB中,我们跨节点切片数据,然后将查询发送到数据。这是数据库的基本原则之一,它允许随着添加更多节点而几乎线性地扩展。
有关如何分布数据的概念,请参阅数据分布,因为本页假定您理解这些概念。需要记住的主要概念是,表和索引是跨节点划分的,并且每个表和索引都有自己的分布,这使我们能够在给定的主列下精确地知道数据的位置。
并行查询求值(通过示例)
ClustrixDB对简单查询使用并行查询求值,对分析查询(类似于柱状存储)使用大规模并行处理(MPP)。
最好看一些示例来理解查询求值以及为什么查询(几乎)是使用ClustrixDB线性扩展的。让我们从一个SQL模式开始,并通过一些示例进行讨论。
sql> CREATE TABLE bundler ( id INT default NULL auto_increment, name char(60) default NULL, PRIMARY KEY (id) ); sql> CREATE TABLE donation ( id INT default NULL auto_increment, bundler_id INT, amount DOUBLE, PRIMARY KEY (id), KEY bundler_key (bundler_id, amount) );
现在,让我们看看这种情况下的数据分布。我们有三种表达方式:
- _id_primary_bundler
- _id_primary_donation
- _bundler_key_donation
前两个是基于它们的id字段分布的。最后一个是基于bundler_id的。请注意,由于这些是散列分布的,所以具有相同键值的所有行都指向相同的节点。
扩展简单查询
在这里,我们将简单的查询定义为点选择和插入。让我们考虑一个简单的读(一个简单的写遵循相同的路径):
sql> SELECT id, amount FROM donation WHERE id = 15;
数据将从排序副本中读取。它可以驻留在同一个节点上,也可以只需要一个跳转。下图展示了这两种情况。随着数据集大小和节点数量的增加,一个查询所需的跳数(0或1)不会改变。这允许读写的线性可伸缩性。另外,如果有两个或多个副本(通常是这种情况),则至少有一个写操作跃点(因为两个副本不能驻留在同一个节点上)。