【问题标题】:create temp table from join contained + 65 milion of records Mysql从包含的连接创建临时表+ 6500万条记录Mysql
【发布时间】:2018-07-11 00:27:48
【问题描述】:

我正在使用 Mysql 我有两个表,我在 proc 运行期间对其进行了多次选择,每个表都有更多的棕褐色 1 亿条记录,为了加快 proc 我想执行此操作,将其作为临时表(包含65+ 百万条记录),稍后在过程中使用此表。创建它。我在用 。下一个 。

   create temporary table T_join (INDEX(tm_id))
    SELECT 
        t1.id,
        t2.tm_id,
        t1.code,
        t1.bincode,
        t1.AU,
        t1.TA,
        t2.fin_amount,
        t2.m_id
    FROM
        pm_customers t1
            INNER JOIN
       client_transactions_final t2 ON t1.id = t2.id

直截了当的唯一问题就是创建这个temp table proc 耗时20多分钟,如何加快速度?

【问题讨论】:

  • 好吧,你必须在某个地方咬紧牙关。一旦你付出了等待 20 分钟的代价(并且还牺牲了一些内存空间),你就有了一个索引临时表,你可以使用它来加快其他一切。
  • @Tim Biegeleisen 我知道,但我不确定它是否会在 20 分钟内完成 :) 这可能需要更长的时间,所以我正在努力寻找减少运行时间的解决方案
  • 该视图听起来像是它大约 65% 的数据...这比 2 次全表扫描更好(它可能会这样做)...很难在没有看到的情况下推荐一些东西过程虽然
  • @Ctznkane525 有视图。它很糟糕,因为我无法在其上创建索引,而且它在两个沉重的表之间始终是相同的连接,我将调用该视图
  • 临时表的索引改为主键会不会更快?基于主键和索引的工作原理

标签: mysql sql temp-tables create-table


【解决方案1】:

对于这个查询:

SELECT c.id, ct.tm_id, c.code, t1.bincode, c.AU, c.TA,
       ct.fin_amount, ct.m_id
FROM pm_customers c INNER JOIN
     client_transactions_final ct
     ON c.id = ct.id;

您可能希望在client_transactions_final(id, tm_id, fin_amount, m_id) 上建立索引。这是查询的覆盖索引,因此应该会提高性能。

我不相信您真的需要创建这个临时表。使用正确的索引,连接通常很快。当您有聚合和更复杂的查询时,临时表更有意义。我并不是说它不起作用,只是它不是第一个想到的解决方案。

【讨论】:

  • 我只是认为在 proc 运行期间执行此连接 7 次没有意义,因为 pm_customers 有 130 000 000 条记录,client_transactions_final 996 000 000 条记录,一直执行相同的连接很不方便
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多