替代非常慢的服务器2上的内部联接

时间:2014-04-15 14:00:50

标签: mysql sql performance memory optimization

我在远程Windows 7服务器上有一个非常简单的mysql查询,我无法更改大多数参数。我现在只需要执行一次,创建一个表,但在即将到来的项目中,我将面临同样的问题。

查询如下,现在已经运行24小时,这是一个基本的过滤查询:

CREATE TABLE compute_us_gum_2013P13
SELECT A.HHID, UPC, DIVISION, yearweek, CAL_DT, RETAILER, DEAL, RAW_PURCH_QTY,
UNITS,VOL,GROSS_DOL,NET_DOL, CREATE_DATE
FROM work_us_gum_2013P13_digital_purchases_with_yearweek A
INNER JOIN compute_us_gum_2013_digital_panelists B
on A.hhid = B.hhid;

表A相当大,大约2.5亿行。 表B是500万行 hhid在两个表上都被编入索引,虽然我可以在表B中放置一个唯一的索引,但是它会改变一些事情吗?

我的12 GB内存完全饱和(实际上有1GB免费,但我认为mysql无法触及它)。当然,我关闭了我所能做的一切,处理器基本上没有使用。大多数时候,查询的状态一直停留在“发送数据”上。

表A还有一个7列的封面索引,我可以放弃它,因为它没有被使用,但我不认为它会改变一些东西吗?

我遇到的一个大问题是我无法测试很多东西,因为我不知道它是否有效直到它起作用,我认为无论如何这个查询都会很长。此外,我不想失去已经花费的计算时间。

我还可以,如果它只帮助保留HHID,UPC和yearweek(resp bigint(20),bigint(20)和int(11)列,尽管我要删除的列只是小数和日期。

如果我将表B分成几个部分怎么办?操作只是一个过滤操作,所以它可以分几个步骤完成,我会赢得时间吗?如果我没有时间但也没有失去,至少我可以看到我的进步。

另一种可能性是直接删除表A中的行(如果真的有必要,列),所以我不必写另一个表,它会更快吗?

如果我向客户端发送电子邮件,我可以更改一些数据库参数,但这需要一些时间,不适合大量的tweeking和测试。

任何解决方案都会欣赏,即使是最脏的:),我真的被困在这里。

编辑:

解释给我这个:

Id  select_type table   type    possible_keys   key     keylen  ref             row     Extra
1   Simple      B       index   hhidx           hhidx   8       NULL            5003865 Using Index
1   Simple      A       ref     hhidx           hhidx   8       ncsmars.B.hhid  6       [nothing]

1 个答案:

答案 0 :(得分:0)

什么是引擎?是InnoDB吗? 两个表的主键是什么? 您是否使用HHID启动了两个主键(如果HHID不是表的候选键 - 您可以创建复合键并从该字段启动它)? 如果您从HHID启动两个PK,然后将在该字段上加入您的表 - 磁盘搜索将大大减少,因此您应该看到更好的性能。如果你不能改变两个表 - 从较小的表开始 - 改变它的PK以在它的第一个地方有HHID然后检查执行计划。

   ALTER TABLE compute_us_gum_2013_digital_panelists ADD PRIMARY KEY(HHID, [other necessary fields (if any)])

假设它会比以前更好。