2011-10-18 12 views
0

を最適化する必要があるクエリです:DATE_ADD()を含むmysqlクエリを最適化する方法は?ここ

Scans: 527676 records... 
Returns: 496 records... 

SELECT * FROM customers c 
WHERE DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 
AND c.`custtype`='L' 

これはDATE_ADDを使用しなくても同じです。

Scans: 801 records... 
Returns: 481 records... 

SELECT * FROM customers c 
WHERE c.`custdate` BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 

質問は、私はDATE_ADD()関数を使用してこのクエリを最適化する方法であります? DATE_ADDを使用せずにインデックスを取得し、クエリは正常です。

これに関するヘルプをお待ちしています。

おかげで、

Raheel

答えて

3

あなただけc.custdateに一定の時間間隔を追加しているので、どのような動作するはずですが、論理的に同等のクエリを取得するために、BETWEEN値から、その時間間隔を減算する代わりにありますMySQLがインデックスを使用することを許可します。一般に、照会が索引値の関数の評価を必要とする場合、レンジ・スキャンは使用できません。

です:代わりにWHERE句が

DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 

であることのそれ

c.`custdate` BETWEEN '2011-09-14 05:00:00' AND '2011-09-15 04:59:59' 
+0

が完全に合意します - あなたは、問題のフィールド上で機能を実行しているときのMySQLはインデックスを使用することはできません、したがって、フィールドの代わりにフィルター基準で機能を実行しようと常にしてください。 MySQLは利用可能なインデックス –

+0

...を使用することができます。さらに、BETWEEN句の各値に対して "DATE_ADD"機能を実行することは可能です。例えば。 "c.'custdate BETWEEN DATE_ADD( '2011-09-14 00:00:00'インターバル5時間)とDATE_ADD( '2011年5月14日23時59分59秒'インターバル5時間) –

+0

はい、動作します。あなたはGMT-5と同様の結果を得るためにbetween節の両方の日付に5時間を追加することを提案するので、date_addを使用してすべてのクエリをリファクタリングできるようにdatetimeに5時間を追加する便利な関数を知っていますか? –

関連する問題