Mysql 选择非重复记录

Mysql 选择非重复记录,mysql,sql,performance,select,not-exists,Mysql,Sql,Performance,Select,Not Exists,我有一张有大约5000万张唱片的桌子 表结构如下所示,callerid和call_开始字段都被索引 id-callerid-呼叫开始 我想在整个表中选择其call_start大于“2013-12-22”且callerid在“2013-12-22”之前不重复的所有记录 我用了这样的方法: SELECT DISTINCT ca.`callerid` FROM call_archives AS ca WHERE ca.`call_start` >= '2013-12-22'

我有一张有大约5000万张唱片的桌子

表结构如下所示,callerid和call_开始字段都被索引

id-callerid-呼叫开始

我想在整个表中选择其call_start大于“2013-12-22”且callerid在“2013-12-22”之前不重复的所有记录

我用了这样的方法:

SELECT DISTINCT 
  ca.`callerid` 
FROM
  call_archives AS ca 
WHERE ca.`call_start` >= '2013-12-22' 
  AND ca.`callerid` NOT IN 
  (SELECT DISTINCT 
    ca.`callerid` 
  FROM
    call_archives AS ca 
  WHERE ca.`call_start` < '2013-12-21')
但这是非常缓慢的,任何建议都非常感谢

使用不存在而不是不存在

试试这个:

SELECT DISTINCT ca.callerid 
FROM call_archives AS ca 
WHERE ca.call_start>='2013-12-22' AND 
  NOT EXISTS(SELECT 1 FROM call_archives AS ca1 
             WHERE ca.callerid = ca1.callerid AND ca1.call_start <'2013-12-21');
尝试不存在


只是想知道这个查询在您的表上是否运行得很快:

SELECT ca.`callerid` 
FROM call_archives 
GROUP BY ca.`callerid` 
HAVING MIN(ca.`call_start`) >='2013-12-22' 

查询执行时间的显著改进。感谢这一改进的执行时间,但没有我预期的那么多。
SELECT ca.`callerid` 
FROM call_archives 
GROUP BY ca.`callerid` 
HAVING MIN(ca.`call_start`) >='2013-12-22'