【发布时间】: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