lookup join 使用缓存参数和不使用缓存参数的执行前后对比

server/2024/12/26 11:47:31/

0.先看结论

#缓存开启参数,默认关闭'lookup.cache.max-rows' = '1000',  -- 设置最大缓存条目数为 1000'lookup.cache.ttl' = '10 min'     -- 设置缓存条目的最大存活时间为 10 分钟

启用缓存

  • 查询时性能较高,因为数据直接从缓存中读取。
  • 缓存未过期时,MySQL 的查询负载较低。
  • 适用于维表数据变化较少的场景。

不启用缓存

  • 每次查询都会访问 MySQL,性能取决于 MySQL 查询效率。
  • MySQL 负载较高,不适合高频查询场景。

1.kafka准备工作

#(1)启动zk
[root@node1 server]# /export/server/zookeeper/bin/zkServer.sh start#确认 Zookeeper 是否在 2181 端口监听:
[root@node1 server]# netstat -tulnp | grep 2181
tcp6       0      0 :::2181                 :::*                    LISTEN      4651/java  结果显示在监听中,没问题#(2)启动kafka
[root@node1 bin]# cd /export/server/kafka/bin
[root@node1 bin]# kafka-server-start.sh -daemon /export/server/kafka/config/server.properties
[root@node1 bin]# netstat -tulnp | grep 9092
tcp6       0      0 192.168.77.161:9092     :::*                    LISTEN      23613/java    结果显示在监听中,没问题#(3)创建topic
[root@node1 bin]# kafka-topics.sh --create \--bootstrap-server node1:9092 \--replication-factor 1 \--partitions 1 \--topic orders_topic#检查是否创建成功
[root@node1 bin]# ./kafka-topics.sh --bootstrap-server node1:9092 --list | grep orders_topic
orders_topic有显示表示创建成功#(4)生产数据
[root@node1 bin]# cd /export/server/kafka/bin
[root@node1 bin]# kafka-console-producer.sh --broker-list node1:9092 --topic orders_topic{"order_id": 1, "customer_id": 101, "order_time": "2024-01-01 10:00:00"}
{"order_id": 2, "customer_id": 102, "order_time": "2024-01-01 10:05:00"}
{"order_id": 3, "customer_id": 103, "order_time": "2024-01-01 10:10:00"}#(5)测试kafka消费数据
/export/server/kafka/bin/kafka-console-consumer.sh --bootstrap-server node1:9092 --topic orders_topic --from-beginning
/export/server/kafka/bin/kafka-console-consumer.sh --bootstrap-server node1:9092 --topic orders_topic --group group_test --from-beginning-----备用-------
#删除kafka toopic
/export/server/kafka/bin/kafka-topics.sh --delete --topic orders_topic --bootstrap-server node1:9092
#重新创建相同的 Topic:
/export/server/kafka/bin/kafka-topics.sh --create --topic orders_topic --bootstrap-server node1:9092 --partitions 1 --replication-factor 1------------

2.mysql准备工作

#创建表 和插入数据
CREATE DATABASE IF NOT EXISTS test;
USE test;CREATE TABLE dim_customer (customer_id BIGINT PRIMARY KEY,customer_name VARCHAR(255)
);INSERT INTO dim_customer (customer_id, customer_name) VALUES
(101, 'Alice'),
(102, 'Bob'),
(103, 'Charlie');

3.flinksql

#hadoop,我的checkpoint 数据是存hdfs的,所以要启动
start-dfs.sh#启动flink
cd /export/server/flink
bin/start-cluster.sh#启动flink sql客户端
sql-client.sh 

#创建一个从 Kafka 读取订单流数据的表
CREATE TABLE orders (order_id BIGINT,customer_id BIGINT,order_time TIMESTAMP(3),proc_time AS PROCTIME() -- 定义 Processing Time
) WITH ('connector' = 'kafka','topic' = 'orders_topic','properties.bootstrap.servers' = 'node1:9092','properties.group.id' = 'flink_group','format' = 'json','scan.startup.mode' = 'earliest-offset'
);select * from orders limit 5;#创建一个从 MySQL 查询客户信息的维表:
CREATE TABLE dim_customer (customer_id BIGINT,customer_name STRING,PRIMARY KEY (customer_id) NOT ENFORCED
) WITH ('connector' = 'jdbc','url' = 'jdbc:mysql://node1:3306/test','table-name' = 'dim_customer','username' = 'root','password' = '123456','lookup.cache.max-rows' = '1000',  -- 最大缓存行数'lookup.cache.ttl' = '10 min'     -- 缓存有效时间为 10 分钟
);
select * from dim_customer;#实现订单流与客户信息的 Lookup Join:
SELECTo.order_id,o.customer_id,c.customer_name,o.order_time
FROM orders AS o
LEFT JOIN dim_customer FOR SYSTEM_TIME AS OF o.proc_time AS c
ON o.customer_id = c.customer_id;---------不启动缓存查询---------
CREATE TABLE dim_customer_no_cache (customer_id BIGINT,customer_name STRING,PRIMARY KEY (customer_id) NOT ENFORCED
) WITH ('connector' = 'jdbc','url' = 'jdbc:mysql://node1:3306/test','table-name' = 'dim_customer','username' = 'root','password' = '123456'
);SELECTo.order_id,o.customer_id,c.customer_name,o.order_time
FROM orders AS o
LEFT JOIN dim_customer_no_cache FOR SYSTEM_TIME AS OF o.order_time AS c
ON o.customer_id = c.customer_id;
更新维表数据(在查询过程中):UPDATE dim_customer SET customer_name = 'Alice Updated' WHERE customer_id = 101;
UPDATE dim_customer SET customer_name = 'Bob Updated' WHERE customer_id = 102;
1. 启用缓存
表现:
(1)如果缓存未过期,查询结果不会反映 dim_customer 表的实时更新。
(2)更新 dim_customer 后,直到缓存失效(TTL 到期),才会刷新缓存并获取最新数据。
(3)预期结果如下
初始查询结果:无变化
+------------+-------------+---------------+---------------------+
| order_id   | customer_id | customer_name | order_time          |
+------------+-------------+---------------+---------------------+
| 1          | 101         | Alice         | 2024-01-01 10:00:00 |
| 2          | 102         | Bob           | 2024-01-01 10:05:00 |
| 3          | 103         | Charlie       | 2024-01-01 10:10:00 |
+------------+-------------+---------------+---------------------+更新 dim_customer 后(缓存未过期):无变化
+------------+-------------+---------------+---------------------+
| order_id   | customer_id | customer_name | order_time          |
+------------+-------------+---------------+---------------------+
| 1          | 101         | Alice         | 2024-01-01 10:00:00 |
| 2          | 102         | Bob           | 2024-01-01 10:05:00 |
| 3          | 103         | Charlie       | 2024-01-01 10:10:00 |
+------------+-------------+---------------+---------------------+
缓存过期后(10 分钟 TTL 到期):更新了
+------------+-------------+------------------+---------------------+
| order_id   | customer_id | customer_name    | order_time          |
+------------+-------------+------------------+---------------------+
| 1          | 101         | Alice Updated    | 2024-01-01 10:00:00 |
| 2          | 102         | Bob Updated      | 2024-01-01 10:05:00 |
| 3          | 103         | Charlie          | 2024-01-01 10:10:00 |
+------------+-------------+------------------+---------------------+
------------------------------------------------------------------------------------
2. 不启用缓存
表现:
(1)每次查询都会直接访问 MySQL,查询结果能够实时反映 dim_customer 表的最新数据。
(2)实时性强,但性能可能较差。
(3)预期结果如下: 初始查询结果:
+------------+-------------+---------------+---------------------+
| order_id   | customer_id | customer_name | order_time          |
+------------+-------------+---------------+---------------------+
| 1          | 101         | Alice         | 2024-01-01 10:00:00 |
| 2          | 102         | Bob           | 2024-01-01 10:05:00 |
| 3          | 103         | Charlie       | 2024-01-01 10:10:00 |
+------------+-------------+---------------+---------------------+更新 dim_customer 后:
+------------+-------------+------------------+---------------------+
| order_id   | customer_id | customer_name    | order_time          |
+------------+-------------+------------------+---------------------+
| 1          | 101         | Alice Updated    | 2024-01-01 10:00:00 |
| 2          | 102         | Bob Updated      | 2024-01-01 10:05:00 |
| 3          | 103         | Charlie          | 2024-01-01 10:10:00 |
+------------+-------------+------------------+---------------------+

http://www.ppmy.cn/server/153303.html

相关文章

可以免费制作翻页电子书的软件

​随着数字化时代的到来,电子书已经成为人们阅读的重要方式之一。翻页电子书以其独特的视觉效果和便捷性,受到了广大读者的喜爱。今天推荐一款免费制作翻页电子书的软件。 1. 实用工具:打开FLBOOK在线制作电子杂志平台。 2. 设计模板&#xf…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发,需要频繁将编写的前端系统打包更新到公司的linux服务器,觉得这种工作纯体力活,有时候太浪费时间,以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…

我在广州学 Mysql 系列——数据表查询命令详解

ℹ️大家好,我是LXJ,今天星期二了,本文将讲述MYSQL查询数据的详细命令以及相关例题~~ 复习:👉《Mysql函数的练习题》 同时,数据库相关内容查看专栏👉【数据库专栏】~ 想要了解更多内容请点击我的…

ARM 获取cpu个数

MPIDR_EL1寄存器 AFF0 :表示一个 core 中的第几个 thread,大多数 core 都是 single-threaded core,所以大多数 core 中的该值是 0. AFF1:表示一个 cluster 中的第几个 cpu AFF2/AFF3:表示系统中的第几个 cluster&#…

(七)循环神经网络_LSTM长短期记忆网络

一、RNN存在的问题 二、LSTM的基本思想 三、链式结构和门控单元 RNN都有重复链式结构: 标准RNN结构简单;LSTM链式结构特殊。 LSTM专门设计了 3种门控单元来控制信息的保留和丢弃。 具体来说包括了三种门。 之所以称之为门,一定要有一个控制…

Ajax笔记

Ajax入门 01.AJAX 概念和 axios 使用 讲解 什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest 对象 与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端&a…

模电_郑益慧_笔记_2_PN结的形成

载流子的浓度 本征激发的速度与温度相关;复合与载流子浓度相关; 当温度升高时,本征激发加剧,载流子浓度逐渐上升;同时随着载流子浓度上升,复合加剧,载流子浓度逐渐下降;最终&#x…

浏览器语音视频功能

需求: 1:查看当前的语音视频频道的队列状况 2:获取到临时的语音视频用户名 3:跳转到指定的语音聊天房间 lc/Pyfile/Pywebback/app/yuyin/templates/zhuye/base.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"…