摘要:
我已经尝试过对 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 表以进行更新需要几个小时。我尝试为每个步骤创建两个临时表;代码如下,但当我尝试更新/内连接两个临时表时,它也会挂起几个小时。
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 语句......然后挂起几个小时。
有什么建议吗?谢谢。
最佳答案
您需要 tmp2(ip)
上的索引。实际上,这个索引可能是最好的:
create index idx_tmp2_ip_uvi on tmp2(ip, unique_visitor_id)
关于MySql:在两个表上使用内部联接进行更新挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341452/