2017-12-02 170 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)這是年份和月份,日期合併爲一個日期,沒有時間元素..但通常總是最好將表格數據單獨保存,而不是格式化或將其轉換爲僅匹配查詢。如果您轉換表格數據,則不能再使用索引。如果您多花一分鐘將查詢參數轉換爲列的格式,並且不轉換表格數據,則可以使用列上的索引