MySql:在两个表上使用内部联接进行更新挂起

标签 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 表以进行更新需要几个小时。我尝试为每个步骤创建两个临时表;代码如下,但当我尝试更新/内连接两个临时表时,它也会挂起几个小时。

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/

相关文章:

mysql - SQL 查询 - 提取带有空值的查询

php - Jquery UI 自动完成重音图不适用于斯拉夫字符

r - 删除R中所有重复项的最快方法

c - 如何最好地迭代 C 数组?使用指针还是索引?

performance - 您采用了哪些策略来提高 Web 应用程序的性能?

mysql - 关于Mysql join case when error

mysql - WHERE 条件中的 IF 语句

php - 基于关键词的 PHP 中的 MySQL 搜索

java - JPA @OneToMany 集和独特的内容

php - 使用左连接从其他表获取最低价格