复制到Tmp表时,Mysql太慢

时间:2011-12-07 20:35:13

标签: php mysql performance join left-join

我在几个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我会非常感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

从字面上看,愚蠢的规则描述了mysql优化:

  

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

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

创建索引也会缩小规模并增加速度。您通常在索引中包含典型查询中的列名。