要点:
我已经在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语句..然后挂起几个小时。
有什么建议吗?感谢。
答案 0 :(得分:2)
您需要tmp2(ip)
上的索引。实际上,这个指数可能是最好的:
create index idx_tmp2_ip_uvi on tmp2(ip, unique_visitor_id)