2017-12-02 17 views
-1

こんにちは、私はかなりawfullクエリを持って、それは最適化が必要です。mysql最適化クエリの日付時刻

作成日がNOW - 35daysに一致するすべてのレコードを選択する必要がありますが、分と秒は任意です。

だから私は、ここにその醜いをこのクエリを持っていますが、作業:

を任意の最適化のヒントは大歓迎です!

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

多くの人がここでクエリを最適化するためのヘルプを依頼しています。あなたは、上向きにされ、答えられた質問のいくつかを見ることから始めるかもしれません。前者の共通の特徴は、スキーマ定義、プランの説明、partialnand full select文のタイミングです。 – 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 

ません。

0

あなたはなぜそれが動作しない

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

35日前、あなたはそれが現在であるとして、それらが作成された時間は同じ時間であったテーブルからすべての行を選択したいと言っているように見えますか? curdateは今日深夜に私たちに与えてくれます。現在の時間を追加します(例えば、今度は午後5時には午後5時に17を与えるHOUR(NOW())を追加すると仮定します)。しかし、35日であるので840を減算します* 24時間1日= 840時間。したがって、現在の日付、つまり午後5時から午後5時までに-823時間を追加する

時間からすべてのレコードを取得するための検索範囲を作成します。一時間後に指定する最も簡単な方法は、839時間代わりに840

技術的にこのクエリも(ただし秒後)35日前包括的すぎるとの間にあるため(1〜10本の場合は10も

を返します午後6時に強打されているレコードを返します。問題が発生した場合は、BETWEENをcreated >= blah AND created < blahblahに変更してください。

残りのクエリは入れていません。あなたがそれをしたやり方は、年/月/日部品を持たないことで単純化することができました。ちょうどその日付の一部をdate(created) = date_sub(curdate(), interval 35 day)でドロップするだけでした。年の月と日を日付として組み合わせたものです。時間要素はありません。しかし、通常は、テーブルのデータを書式ではなく単なるままにしておくか、クエリに一致するように変換するのが最善です。表データを変換すると、索引を使用できなくなります。クエリのパラメータを列の形式に変換してテーブルのデータを変換しない場合は、列のインデックスを使用することができます。