Php Mysql在复制到Tmp表时速度太慢

Php Mysql在复制到Tmp表时速度太慢,php,mysql,performance,join,left-join,Php,Mysql,Performance,Join,Left Join,我将数据分割到几个mysql表中以防止数据重复,但是当我实际去服务数据时,连接它们的速度太慢了。因此,我正在为可能在不久的将来需要的数据构建一个小得多的缓存表(某些数据仅与小时间段相关,因此整个表约为700000行,但缓存约为6000行)。 构建此缓存在复制到实际缓存表之前使用临时表,以便在每晚构建表时,实时缓存表不会下降。有时缓存表在大约30分钟内构建完成,但有时它会被卡住,永远无法完成。在进程列表中,它只是说复制到tmp表,但如果我允许,它会旋转好几天 如何防止陷入复制到tmp表的中?我环顾

我将数据分割到几个mysql表中以防止数据重复,但是当我实际去服务数据时,连接它们的速度太慢了。因此,我正在为可能在不久的将来需要的数据构建一个小得多的缓存表(某些数据仅与小时间段相关,因此整个表约为700000行,但缓存约为6000行)。
构建此缓存在复制到实际缓存表之前使用临时表,以便在每晚构建表时,实时缓存表不会下降。有时缓存表在大约30分钟内构建完成,但有时它会被卡住,永远无法完成。在进程列表中,它只是说
复制到tmp表
,但如果我允许,它会旋转好几天

如何防止陷入复制到tmp表的
中?我环顾四周,在网上我找不到一个非常清楚的答案,除了一些我试图遵循但没有效果的信息

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

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
需要左连接,因为我希望在内部选择中有数据的副本(如果存在),但如果不存在,则不希望受其限制。

如果这不够具体,我很抱歉,但是如果有人知道如何防止
复制到tmp表,我将不胜感激。

您在表上设置了索引吗?在联接中使用的列上的索引将加快select查询的速度。
在这种情况下,可能更好的解决方案是物化视图:

据我所知,MYSQL优化的主要原则有两个极端(外键可能性除外):

  • 尺寸优化
  • 优化速度
不是字面意思,愚弄规则描述了mysql优化:

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

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


创建索引也会降低和提高速度。通常会在索引中包含典型查询中的列名。

我已确保所有要加入的内容都有索引(可能除了内部select语句,因为这是动态完成的)但我现在正在阅读有关物化视图的文章…所以看来mysql并没有真正的物化视图支持,要实现它们,您只需边计算边记住它们,这样您就不必在查询时计算它们了。。。对于这个查询,我记不起来了,缓存表的构建是物化视图刷新步骤。。。我遗漏了什么吗?好吧,现在我看到,当你使用mysql“触发器”时,具体化视图会稍微多一些,但不幸的是,这对我的应用程序不起作用,因为连接是保持最新状态所需的基本计算,而连接是我想象的,它会占用你所有的时间,你可以分析一下你的查询。使用EXPLAIN(您的查询)查看查询的哪个部分花费的时间最多。之后,您将能够改进查询的这一部分,或者以不同的方式重写它。尝试分析您的查询。。也许一次只添加一个连接,然后看看哪个连接占用的时间最多。MySQL完全能够以极高的速度连接具有100万行的大型表。你能发布你的模式并解释你的查询计划吗。