繁体   English   中英

优化SQL查询-在选择中选择

[英]Optimize sql query - select in select

在select mysql查询中优化select的最佳方法是哪一种?

这是我的示例:

SELECT count(distinct email) 
FROM emails_stats 
WHERE DATE_FORMAT(time, '%Y-%m-%d') >= '2012-12-12' 
 and email in (SELECT email 
               FROM `reminder` 
               WHERE DATE_FORMAT(time, '%Y-%m-%d') = '2012-12-12')

我的数据库有超过500k条目。

SELECT count(distinct emails_stats.email) 
FROM emails_stats 
JOIN reminder ON emails_stats.email= reminder.email
WHERE 
    emails_stats.time >= CAST('2012-12-12 00:00:00' AS datetime) AND
    (reminder.time BETWEEN CAST('2012-12-12 00:00:00' AS datetime) AND CAST('2012-12-12 23:59:59' AS datetime));

如果在表字段中使用date_format(),则mysql将需要遍历表中的每一行,因为它需要获取该date_format()函数的结果才能将值与给定的字符串进行比较。 为了使其更快,请为“时间”字段创建索引,并改用此查询。 这样,mysql只需查找索引即可确定需要哪些行。

改用exist子句:

SELECT count(distinct email) 
FROM emails_stats 
WHERE DATE_FORMAT(time, '%Y-%m-%d') >= '2012-12-12' 
and exists (SELECT 1
                   FROM `reminder` 
                   WHERE emails_stats.email = `reminder`.email 
                   and DATE_FORMAT(time, '%Y-%m-%d') = '2012-12-12')

最好的方法是在这里使用join

SELECT count(distinct emails_stats.email) 
FROM emails_stats 
JOIN reminder ON emails_stats.email= reminder.email
WHERE DATE_FORMAT(emails_stats.time, '%Y-%m-%d') >= '2012-12-12';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM