2017-12-02 169 views
-1

大家好,我有非常awfull查询,需要优化。mysql优化查询在哪里日期小时

我需要选择所有创建日期与现在匹配的记录 - 35天,但分钟和秒可以是任何。

所以我在这里有这个疑问,它的丑陋,但工作:

任何优化建议,欢迎!

SELECT * FROM outbound_email 
       oe 
       INNER JOIN (SELECT `issue_id` FROM `issues` WHERE 1 ORDER BY year DESC, NUM DESC LIMIT 0,5) as issues 
       ON oe.issue_id = issues.issue_id 
       WHERE 
        year(created) = year( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        month(created) = month( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        day(created) = day( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        hour(created) = hour( DATE_SUB(NOW(), INTERVAL 35 DAY)) 
        AND campaign_id IN (SELECT id FROM campaigns WHERE initial = 1) 
+0

许多人在SO上寻求优化查询的帮助。你可以先看看一些问题,并回答问题,并回答那些被低估和结束的问题。前者的共同特征是模式定义,解释计划,partial和full选择语句的计时。 – symcbean

回答

0

我认为“创造”的字段是一个日期时间字段,是从问题表?既然你不需要任何的问题和竞选表一样,那么你就可以做到以下几点:

SELECT e.* FROM outbound_email e 
JOIN issues i ON e.issue_id = i.issue_id 
JOIN campaigns c ON c.id = i.campaign_id 
WHERE i.created < DATE_SUB(NOW(), INTERVAL 35 DAY) 
AND c.initial = 1 

没有必要到datetime场分为年,月...等。

0

你似乎在说你想从表中选择在其中创建它们的时间是同一时间,因为它是目前35天前

SELECT * FROM table WHERE created BETWEEN 
    DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 840) HOUR) AND 
    DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 839) HOUR) 

为什么它的工作都行? Curdate今天午夜给我们。我们在当前时间加上这个时间(例如,假设现在是下午5点,我们将添加'HOUR(NOW()),这会给我们17,现在是5pm的时间),但是我们也减去840,因为那是35天*每天24小时= 840小时。因此,添加日期因此将在当前日期,即35天前下午5点加上-823小时

我们使搜索范围从小时获得所有记录,指定一小时后的最简单方法是减去839小时而不是840

技术上此查询也将返回都在下午6点砰记录(但不晚一秒钟)35天前也因为是(含)之间(1和10之间将返回10还

如果这是一个问题,改变BETWEEN为created >= blah AND created < blahblah

我还没有把你的查询的其余部分出于清晰的原因

作为一个便笺,您做这件事的方式并不差 - 您可以通过没有年/月/日部分来简化事情,只需将日期的一部分与date(created) = date_sub(curdate(), interval 35 day)这是年份和月份,日期合并为一个日期,没有时间元素..但通常总是最好将表格数据单独保存,而不是格式化或将其转换为仅匹配查询。如果您转换表格数据,则不能再使用索引。如果您多花一分钟将查询参数转换为列的格式,并且不转换表格数据,则可以使用列上的索引