【问题标题】:Mysql too Slow when Copying to Tmp Table复制到Tmp表时Mysql太慢
【发布时间】:2012-01-15 08:49:58
【问题描述】:

我将数据拆分到多个 mysql 表中以防止数据重复,但是当我实际去提供数据时,加入它们太慢了。因此,我正在构建一个更小的数据缓存表,这可能会在不久的将来需要(某些数据仅与一小段时间相关,因此整个表约为 700,000 行,但缓存约为 6,000)。 构建此缓存在复制到实际缓存表之前使用临时表,以便在每晚构建表时,实时缓存表不会关闭。有时缓存表会在大约 30 分钟内建立,但有时它会卡住并且永远不会完成。在进程列表中它只是说Copying to tmp table,但如果我允许它会旋转几天。

我可以做些什么来防止卡在Copying to tmp table?我环顾四周,在网上找不到非常明确的答案,除了我试图遵循但无济于事的一些信息here

我认为可能有更好的方法来构建表格而不是解决内存问题,因为最终表格的行数很小(尽管每一行都相当大)。生成缓存表的构建查询的一般形式是

Select col1,col2,col3... FROM tbl1 INNER JOIN tbl2 on ... INNER JOIN tbl3 on ... 
  LEFT JOIN (SELECT col4, col5, col6... FROM tbl4 INNER JOIN tbl5 on ...) 
  AS tbl6 on ... WHERE col2 > NOW() ORDER BY col3, col4

需要左连接,因为如果存在,我希望在内部选择中拥有数据的副本,但如果不存在,我不想受到它的限制。
很抱歉,如果这不够具体,但如果有人知道如何防止Copying to tmp table,我将不胜感激。

【问题讨论】:

  • MySQL 完全有能力以极高的速度连接具有数百万行的大型表。您能否发布您的架构并解释您的查询计划。

标签: php mysql performance join left-join


【解决方案1】:

据我了解,MYSQL优化的主要原则有两极(外键可能性除外):

  • 尺寸优化;
  • 速度优化。

不是字面意思,傻逼规则描述的是mysql优化:

数据量越大,性能越好,反之亦然。

在类似的情况下,我们将聚合表创建为真实表,而不是缓存表,也不是临时表。这减少了计算量并为您的查询节省了 MYSQL 的运行时间。然后简化查询,清除 JOIN、GROUP BY 封闭的 SELECT、各种函数等。数据被最大程度地减少并事先最少更新(单个单独的查询或 Cron 任务)。

创建索引也会缩小和加快速度。您通常在索引中包含来自典型查询的列名。

【讨论】:

    【解决方案2】:

    您是否为表设置了索引?您在连接中使用的列上的索引将加速选择查询。 在这种情况下,对您来说更好的解决方案可能是物化视图:http://fromdual.com/mysql-materialized-views

    【讨论】:

    • 我已经确保所有正在连接的东西都有索引(可能除了内部 select 语句,因为它是动态完成的),但我现在正在阅读物化视图......
    • 所以 mysql 似乎并没有真正支持物化视图,要实现它们,你只是在进行时计算并记住它们,这样你就不必在查询时计算它们。 ..对于这个查询,我不记得了,缓存表的构建是物化视图刷新步骤...我错过了什么吗?
    • 好的,现在我看到当您使用 mysql 'triggers' 时,物化视图会稍微多一些,但不幸的是,这对我的应用程序不起作用,因为连接是需要进行的基本计算以保持这个最新的和那个加入是我想象的一直在花费的时间
    • 您可以分析一下您的查询。使用 EXPLAIN (your QUERY) 查看查询的哪一部分花费的时间最多。之后,您将能够改进查询的那部分或以不同的方式重写它。尝试剖析您的查询。也许只添加一个联接,然后查看哪个联接占用最多时间。
    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多