共计 2341 个字符,预计需要花费 6 分钟才能阅读完成。
前言
上一篇讲述了 KunlunDB 的查问优化原理(KunlunDB 查问优化(一)),本篇讲述 Project 和 Filter 下推演示。
一、测试表根本信息
1.1 测试环境
本次测试演示投影和过滤操作的下推。
测试环境的数据库集群共有四个数据节点(DN), 配置为两个 shard (shard1 和 shard2),每个 shard 节点由一个主节点和一个从节点形成(shard1 两个节点为数据复制关系,shard2 两个节点也是数据复制关系,shard1 和 shard2 存放数据表的不同分片数据)。如下图:
能够通过上面语句显示集群环境的节点信息
select t1.name, t2.shard_id, t2.hostaddr, t2.port,
t2.user_name, t2.passwd from pg_shard t1, pg_shard_node t2
where t2.shard_id=t1.id;
后果如下图:
1.2 表构造
本次测试的表构造如下图:
1.3 分片信息
表 Customer1 根据 c_id 字段,按范畴分区,对应的分区表别离是:
Customer1_1,Customer1_2,Customer1_3,Customer1_4。
4 个分片数据别离存在两个 shard 里:
select t1.nspname, t2.relname,t2.relshardid, t2.relkind
from pg_namespace t1 join pg_class t2 ont1.oid = t2.relnamespace
where t2.relshardid != 0 and relkind='r' and relname like
'%customer1%' order by t2.relname;
后果如下图:
1.4 数据分布
数据依据分片规定落于不同的分片存储里
四个分区的数据分布如下图:
二、查问过程
2.1 过滤
过滤是对查问范畴的定位,通过过滤,能够缩小数据块的读写数量。
执行过程:计算节点对 SQL 语句解释后,依据查问的指标表 customer1 的分片信息,RemoteScan 将查问语句下推到对应的存储节点执行(过滤不相干的分片),存储节点将查问后果返回到计算节点。
计算节点采取异步操作的模式做查问下推,多个存储节点能够并行执行。
下列语句,依据分片键值范畴,SQL 语句对下推到对应的存储节点(shard2)(这是 SQL 执行引擎的第一过滤)。
explain select c_id,c_first,c_middle from customer1
where c_id=4;
后果如下图:
标记处即为执行打算中的过滤操作。
如果查问条件没有带由分片关键字,RemoteScan 会将语句下发到所有的分片节点,在分片后果依据查问条件过滤。
explain select c_id ,c_middle,c_data from customer1
where c_middle='OE';
后果如下图:
KunlunDB 反对在查问条件中应用函数及各种简单的条件
explain select count(*) from customer1
where sqrt(c_discount)>0.5;
后果如下图:
2.2 Project 投影
计算节点对 SQL 语句解释后,依据查问的指标表 customer1 的分片信息,RemoteScan 将查问语句下推到各个存储节点执行, 存储节点将查问后果行中局部的字段(投影)返回到计算节点。
Project 操作缩小了返回到计算节点的理论字段数量(只返回查问须要的,不相干的字段不会被读入计算节点的内存中去)。
执行过程参考下图:
explain select c_id,c_first,c_middle from customer1;
后果如下图:
下面语句执行过程,remoteScan 只返回字段 c_id,c_first,c_middle 数据到计算节点。
KunlunDB 反对字段上的函数及各种简单条件的 Project
explain selectc_balance + c_ytd_payment from customer1
where c_id =20;
后果如下图:
存储节点只返回 c_balance+c_ytd_payment 的后果到计算节点。
2.3 分片的益处
分布式数据库在数据库层通明的将数据库散布在不同的存储节点,由此带来的益处:
- 对应用程序通明,即应用程序不须要做任何批改就能够拜访数据。
- 存储节点对数据做读取及投影操作,缩小计算节点的负载(更少的 CPU 和内存耗费)。
- 数据分布在不同的存储节点上,不便零碎弹性扩大 IO 能力及防止 IO 的热点竞争。
- 投影和过滤操作,缩小数据块读写范畴,能够进步查问效率。
三、性能比对
在同一个环境里建一个与 customer1 完全相同数据(量)的数据表,而后执行雷同的查问,比照查问的效率。
3.1 对分片表的查问
select now(); select count(*) from customer1
where c_id between 4 and 10;select now();
后果如下图:
耗时:0.05s
3.2 对非分片表查问
创立表:
CREATE TABLEcustomer1temp (like customer1);
insert intocustomer1temp select * From customer1
后果如下图:
查问工夫:
select now(); select count(*) from customer1temp
where c_idbetween 4 and 10 ;select now();
后果如下图:
耗时:0.69s
论断
通过 Project 和 Filter 的利用,表分片能够进步数据查问效率。
*KunlunDB 我的项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb
END