V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
rqxiao
V2EX  ›  MySQL

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

  •  
  •   rqxiao · 2023-09-04 14:48:14 +08:00 · 1863 次点击
    这是一个创建于 424 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2023-09-05 08:08:51 +08:00
    28Sv0ngQfIE7Yloe
        1
    28Sv0ngQfIE7Yloe  
       2023-09-04 14:49:25 +08:00
    前半段看懂了,后半段没看懂
    dayeye2006199
        2
    dayeye2006199  
       2023-09-04 14:52:54 +08:00 via Android
    你先 explain 看一下执行计划,这个查询是在做什么,找数据还是做聚合,啥也没有,怎么谈优化呢?
    ShadowPower
        3
    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
        4
    Ginz  
       2023-09-04 15:00:14 +08:00
    explain 看哪个没走索引,分析分析加试试咯
    oppoic
        5
    oppoic  
       2023-09-04 15:20:52 +08:00
    不用 join ,三次单表查询
    llzzll1234
        6
    llzzll1234  
       2023-09-04 15:38:20 +08:00
    不涉及聚合而且查询量不大的话,直接查多次反而会更快。
    以及,flink 是支持多表 join 后同步的,甚至可以编写复杂 sql 同步和写代码处理数据后同步
    Tenlearn
        7
    Tenlearn  
       2023-09-04 15:42:14 +08:00
    按订单号分三次查?
    NoobNoob030
        8
    NoobNoob030  
       2023-09-04 15:48:55 +08:00
    同步 es 可行,我最近也用 es 优化了一次类似的操作
    opengps
        9
    opengps  
       2023-09-04 15:50:39 +08:00
    只需要问一个问题:三个表的订单号字段,都有独立索引吗?
    Plutooo
        10
    Plutooo  
       2023-09-04 18:11:30 +08:00
    订单号索引,然后单表查询代码做关联就好了吧
    hidemyself
        11
    hidemyself  
       2023-09-04 18:22:10 +08:00
    能不能贴一下 sql 语句,光看描述,感觉应该不会慢
    xuanbg
        12
    xuanbg  
       2023-09-05 08:08:51 +08:00
    有索引的话,应该不会慢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5411 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:19 · PVG 15:19 · LAX 00:19 · JFK 03:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.