IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins)

2023-10-28 20:59

本文主要是介绍IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、并置关联(Affinity Colocation)

在许多情况下,如果不同的条目经常一起访问,则将它们并置在一起就很有用,即在一个节点(存储对象的节点)上就可以执行多条目查询,这个概念称为关联并置。

关联函数将条目分配给分区,具有相同关联键的对象将进入相同的分区,这样就可以设计将相关条目存储在一起的数据模型,这里的“相关”是指处于父子关系的对象或经常一起查询的对象。

我的理解:如果是分区模式partition,那么关联函数会确定键/主键对应的partition编号,会将大的数据拆分为多个小块,分别存储到不同index的partition中。如果分别存储在不同键中的数据经常一起查询(类似于SQL的多表联合查询),那么就最好使用并置关联。

使用方式见官网资料,主要就是affinity_key关键字。数据建模 | Apache Ignite - 分布式内存数据库


2、分布式关联(Distributed Joins)

分布式关联是指SQL语句中通过关联子句组合了两个或者更多的分区表,如果这些表关联在分区列(关联键)上,该关联称为并置关联,否则称为非并置关联

Ignite默认将每个关联查询都视为并置关联,并按照并置的模式执行

 

我的理解:多表联合查询时候,关联键是分区列(默认主键或者通过affinity_key声明的列),那么就是并置关联,否则就是非并置关联。默认情况下视为并置关联(distributdJoins=false),如果要采用非并置关联,需要设置distributdJoins=true


 3、一些尝试

   环境:ignite-2.14.0,ignite single server

  3.1两表联查

  •  未使用并置关联:
CREATE TABLE IF NOT EXISTS PERSON (ID INT,NAME VARCHAR,EMAIL VARCHAR,COMPANY_ID VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";CREATE TABLE IF NOT EXISTS COMPANY (ID INT,NAME VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10001, 'TOM', 'TOM@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10002, 'LILY', 'LILY@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10003, 'SHERRY', 'SHERRY@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10004, 'PETTER', 'PETTER@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10005, 'LIVIA', 'LIVIA@123.COM',3); INSERT INTO COMPANY (ID, NAME) VALUES(1, 'A-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(2, 'B-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(3, 'C-COMPANY');

这里partition的index大致结果是id%1024(因为默认1024个分区),但是这并不是简单的哈希映射,起码节点宕机,未受影响的节点partition index并不会发生变化。

1.使用默认并置关联查询:当关联时用主表的列当查询条件,副表的列信息未查询出来。可以用ignite2.7.5再试试

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

2.使用非并置查询:查询结果没问题

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

  • 使用并置关联
CREATE TABLE IF NOT EXISTS PERSON (ID INT,NAME VARCHAR,EMAIL VARCHAR,COMPANY_ID VARCHAR,PRIMARY KEY (ID, COMPANY_ID)
) WITH "TEMPLATE=PARTITIONED,AFFINITY_KEY=COMPANY_ID";CREATE TABLE IF NOT EXISTS COMPANY (ID INT,NAME VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10001, 'TOM', 'TOM@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10002, 'LILY', 'LILY@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10003, 'SHERRY', 'SHERRY@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10004, 'PETTER', 'PETTER@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10005, 'LIVIA', 'LIVIA@123.COM',3); INSERT INTO COMPANY (ID, NAME) VALUES(1, 'A-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(2, 'B-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(3, 'C-COMPANY');

这里person的partition index发生了变化,不清楚计算规则。

1.使用默认并置关联查询:查询无误

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

2.使用非并置查询:查询结果没问题。但是感觉多此一举。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

3.2 三表联查

有两张主表STUDENT和COURSE,以及一张中间表STUDENT_COURSE,如果要按照并置处理,那么中间表的两个字段STUDENT_ID和COURSE_ID都应该并置关联处理,但是affinity_Key只支持一个。所以这里只能用非并置处理。

CREATE TABLE STUDENT(ID BIGINT PRIMARY KEY,NAME VARCHAR,EMAIL VARCHAR,
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10001, 'Tom', 'tom@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10002, 'Lily', 'lily@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10003, 'Sherry', 'sherry@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10004, 'Petter', 'petter@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10005, 'Livia', 'livia@123.com');CREATE TABLE STUDENT_COURSE(ID BIGINT PRIMARY KEY,STUDENT_ID BIGINT NOT NULL,COURSE_ID  BIGINT NOT NULL
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(1, 10001, 1);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(2, 10002, 2);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(3, 10003, 3);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(4, 10004, 2);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(5, 10005, 3);CREATE TABLE COURSE(ID BIGINT PRIMARY KEY,NAME VARCHAR,CREDIT_RATING INT,
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(1, 'Criminal Evidence', 20);
INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(2, 'Employment Law', 10);
INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(3, 'Jurisprudence', 30);
  • 使用并置查询。我们先使用并置查询试试,结果确实是某些列无法查出结果。奇怪的是在2.7.5版本的ignite,此现象并不会出现。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

  • 使用非并置查询:查询报错,提示分布式查询没有使用索引。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

添加索引

CREATE INDEX IF NOT EXISTS STUDENT_COURSE_INDEX ON STUDENT_COURSE (STUDENT_ID,COURSE_ID);

在查询,结果无误。

 这个有个问题是:

官网描述是对于replicated模式,需要创建索引,否则异常,但是我的建表语句明确指明是partition模式,为何不建索引所以会出现异常?

这篇关于IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/Demi_nini/article/details/128387745
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/295906

相关文章

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现