我正在尝试获取第二个表中不存在的列表。我看到了各种Q& A和博客。大多数人建议NOT IN和LEFT JOIN。因为我必须在第二个表上设置过滤器,所以我首选NOT IN和子查询。我的第二个表包含10M +行。我正在尝试以下查询
SELECT DISTINCT t1.username, t1.column2, t1.column3, t1.column4, t1.column5
FROM table1 t1
WHERE t1.username NOT IN (
SELECT DISTINCT t2.username
FROM table2 t2
WHERE timestamp >= ". $activityDate ."
AND timestamp < ( DATE_ADD( ". $activityDate ." , INTERVAL 24 HOUR ) )
)
AND t1.column2 = 'Dhaka' AND t1.column3 <> 'India'
GROUP BY t1.username
ORDER BY t1.username DESC
有时会显示#2004 Server has gone away
错误。
有没有办法加快结果以加快响应速度?
答案 0 :(得分:1)
SELECT DISTINCT t1.username, t1.column2, t1.column3, t1.column4, t1.column5
FROM table1 t1
LEFT JOIN table2 t2
ON t1.username = t2.username
AND t2.timestamp BETWEEN " . $startDate .
" AND " . $endDate . "
WHERE t2.username IS NULL
...
确保索引用户名和时间戳列。 预先计算结束日期,没有必要让SQL服务器这样做
答案 1 :(得分:0)
您的第二个SELECT DISTINCT
不是必需的,根据数据,它可能会做很多工作。但我认为真正的问题是一遍又一遍地评估 24小时后的时间戳。
DATE_ADD( ". $activityDate .", INTERVAL 24 HOUR )
除非你有一个聪明的数据库,否则该函数需要每行运行一次。你能计算出查询之外的时间戳吗?