MySql:使用Inner Join更新两个表挂起

时间:2014-08-16 15:06:17

标签: mysql performance join

要点:
我已经在mysql中的两个表上尝试了内部连接的更新的不同变体,但是所有这些都需要数小时才能获得少量数据。我认为它应该是一个基本的更新,非常简单快速,但它总是挂起。有任何建议如何优化它以更好地执行?

详细信息:
在表格中,student_logins是每个访问学生的ip和time_of_visit。每个IP都会多次登录。我想按照每个IP 首次登录的顺序为IP分配排名,并将结果排名(排名号)添加到student_logins表中的每个条目。

示例:
如果这些是样本条目:

10:45 173.99.999.999
10:46 170.99.999.999
10:47 173.99.999.999
10:49 174.99.999.999
10:50 173.99.999.999
10:51 170.99.999.999

然后应该更新表格以显示:
1 10:45 173.99.999.999
2 10:46 170.99.999.999
1 10:47 173.99.999.999
1 10:49 174.99.999.999
3 10:50 173.99.999.999
2 10:51 170.99.999.999

问题:
我能够毫无问题地获得我想要的排名数字,但是我尝试更新表格以包含该排名数字,即使只有几千个测试行也需要几个小时。

我直接尝试使用一个临时表来包含排名,但是将其加入student_logins表以便更新需要几个小时。我尝试为每一步创建两个临时表;代码如下,但当我尝试UPDATE / INNER JOIN两个临时表时,它也会挂起几个小时。

SET @rank=0;

CREATE TEMPORARY TABLE tmp1 
(this_rank int(11), ip varchar(16), time_visit datetime, visitor_id int(11))
(SELECT @rank:=@rank+1 as this_rank, s.ip, s.time_of_visit as time_visit 
 FROM student_logins s
 order by s.time_of_visit, s.ip);

CREATE TEMPORARY TABLE tmp2 (ip varchar(16), unique_visitor_id int(11))
(SELECT tmp1.ip as ip, MIN(this_rank) as unique_visitor_id    
FROM tmp1 
GROUP BY ip);

UPDATE tmp1
INNER JOIN tmp2 on 
 tmp1.ip = tmp2.ip
SET tmp1.visitor_id = tmp2.unique_visitor_id;

在上面的代码中,它快速正确地运行,直到UPDATE语句..然后挂起几个小时。

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:2)

您需要tmp2(ip)上的索引。实际上,这个指数可能是最好的:

create index idx_tmp2_ip_uvi on tmp2(ip, unique_visitor_id)