请教下在一个事务里插入里 a , b , c 表各一条记录,假如三表间根据订单号关联, a,b,c 的记录几千万,导致 abc 三表 join 查询慢,优化方案有哪些

2023-09-04 14:48:14 +08:00
 rqxiao

不用写同步代码高耦合的方案 ,目前想到了 把 mysql 三表数据数据同步到一个新的 mysql 表里 ,然后此表同步 es ,es 来加速查询,flink 支持 同步 多表 join 的查询结果 到 新的一张表里吗

1893 次点击
所在节点    MySQL
12 条回复
28Sv0ngQfIE7Yloe
2023-09-04 14:49:25 +08:00
前半段看懂了,后半段没看懂
dayeye2006199
2023-09-04 14:52:54 +08:00
你先 explain 看一下执行计划,这个查询是在做什么,找数据还是做聚合,啥也没有,怎么谈优化呢?
ShadowPower
2023-09-04 14:59:21 +08:00
拿去问了 GPT-4-0612
得到的回答:

Flink 支持多表 join 的查询结果同步到新的一张表里。你可以使用 Flink SQL 或者 DataStream API 来实现这个需求。

以下是一个使用 Flink SQL 实现的例子:

```java
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

// 注册 a, b, c 三个表
tableEnv.registerTableSource("a", ...);
tableEnv.registerTableSource("b", ...);
tableEnv.registerTableSource("c", ...);

// 执行 join 操作并将结果插入到新的表
tableEnv.sqlUpdate(
"INSERT INTO new_table " +
"SELECT * " +
"FROM a " +
"JOIN b ON a.order_id = b.order_id " +
"JOIN c ON a.order_id = c.order_id"
);

env.execute();
```

这个例子中,我们首先创建了一个 `StreamExecutionEnvironment` 和一个 `StreamTableEnvironment`。然后,我们注册了 a, b, c 三个表。接着,我们执行了一个 join 操作,并将结果插入到新的表中。

需要注意的是,这个例子中的 join 操作是基于事件时间的,并且假设 a, b, c 三个表中的数据都是按照订单号排序的。如果实际情况不是这样,你可能需要使用其他类型的 join 操作,例如 interval join 或者 window join 。

另外,你提到了使用 ES 来加速查询。这确实是一个可行的方案。你可以使用 Flink 的 Elasticsearch connector 将数据写入到 ES 中。然后,你可以使用 ES 的强大的搜索和分析功能来加速查询。

最后,关于优化查询性能,还有一些其他的方案可以考虑:

1. 对关联字段建立索引:如果 abc 三个表都是根据订单号关联的,那么可以考虑对订单号字段建立索引。这样可以大大提高 join 查询的性能。

2. 分区和分桶:如果 abc 三个表的数据量非常大,那么可以考虑对表进行分区和分桶。这样可以将大表切分成多个小表,从而提高查询性能。

3. 使用更快的存储引擎:如果你正在使用 MySQL ,那么可以考虑切换到更快的存储引擎,例如 InnoDB 或者 MyRocks 。

4. 使用列式存储:如果你的查询主要是聚合操作,那么可以考虑使用列式存储,例如 Apache Parquet 或者 ORC 。列式存储可以大大提高聚合查询的性能。

5. 使用缓存:如果你的查询主要是点查操作,那么可以考虑使用缓存,例如 Redis 或者 Memcached 。缓存可以大大提高点查查询的性能。
Ginz
2023-09-04 15:00:14 +08:00
explain 看哪个没走索引,分析分析加试试咯
oppoic
2023-09-04 15:20:52 +08:00
不用 join ,三次单表查询
llzzll1234
2023-09-04 15:38:20 +08:00
不涉及聚合而且查询量不大的话,直接查多次反而会更快。
以及,flink 是支持多表 join 后同步的,甚至可以编写复杂 sql 同步和写代码处理数据后同步
Tenlearn
2023-09-04 15:42:14 +08:00
按订单号分三次查?
NoobNoob030
2023-09-04 15:48:55 +08:00
同步 es 可行,我最近也用 es 优化了一次类似的操作
opengps
2023-09-04 15:50:39 +08:00
只需要问一个问题:三个表的订单号字段,都有独立索引吗?
Plutooo
2023-09-04 18:11:30 +08:00
订单号索引,然后单表查询代码做关联就好了吧
hidemyself
2023-09-04 18:22:10 +08:00
能不能贴一下 sql 语句,光看描述,感觉应该不会慢
xuanbg
2023-09-05 08:08:51 +08:00
有索引的话,应该不会慢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970779

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX