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 · 244 天前 · 1605 次点击
    这是一个创建于 244 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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

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


    http://www.vxiaotou.com