NOT IN在第二个表中使用10M +行执行速度太慢

时间:2017-01-19 11:39:21

标签: php mysql

我正在尝试获取第二个表中不存在的列表。我看到了各种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错误。

有没有办法加快结果以加快响应速度?

2 个答案:

答案 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 )

除非你有一个聪明的数据库,否则该函数需要每行运行一次。你能计算出查询之外的时间戳吗?