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

248 天前
 rqxiao

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

1609 次点击
所在节点    MySQL
12 条回复
Morii
248 天前
前半段看懂了,后半段没看懂
dayeye2006199
248 天前
你先 explain 看一下执行计划,这个查询是在做什么,找数据还是做聚合,啥也没有,怎么谈优化呢?
ShadowPower
248 天前
拿去问了 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
248 天前
explain 看哪个没走索引,分析分析加试试咯
oppoic
248 天前
不用 join ,三次单表查询
llzzll1234
248 天前
不涉及聚合而且查询量不大的话,直接查多次反而会更快。
以及,flink 是支持多表 join 后同步的,甚至可以编写复杂 sql 同步和写代码处理数据后同步
Tenlearn
248 天前
按订单号分三次查?
NoobNoob030
248 天前
同步 es 可行,我最近也用 es 优化了一次类似的操作
opengps
248 天前
只需要问一个问题:三个表的订单号字段,都有独立索引吗?
Plutooo
248 天前
订单号索引,然后单表查询代码做关联就好了吧
hidemyself
248 天前
能不能贴一下 sql 语句,光看描述,感觉应该不会慢
xuanbg
248 天前
有索引的话,应该不会慢

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

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

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

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

© 2021 V2EX