2012-03-20 15 views
0

私はビューとそのクエリは、より効率的にする他の方法を検討していたのは、私は次のSQLクエリクエリをより効率的に

SELECT id, name, title, description, time 
    FROM entity 
    WHERE UNIXTIMESTAMP(CONCAT(date_end, time_end)) > UNIXTIMESTAMP(NOW()) 
    AND UNIXTIMESTAMP(CONCAT(next_date, next_time)) < UNIXTIMESTAMP(NOW()) 

を持っているとしましょう。問題は、処理するエンティティが10,000を超える場合です。クエリに時間がかかります。

上記のクエリをより効率的にするツールとして、MySQLは何を提供していますか?ありがとう!

+0

データベーステーブルのリファクタリングを考慮し、 'DATETIME'フィールドタイプを使用しましたか?あるいは、より良い、 'BIGINT'は未処理のUnixタイムスタンプを保存しますか? –

+0

'date_end'、' time_end'などのデータ型は何ですか? –

+0

、あなたのインデックスはどの列ですか? – Ben

答えて

4

もしあなたが一般的なテクニックの直後になっているのであれば、そのトピックについては既に質問があります。optimizationのMySQLマニュアルセクションはもちろんです。

クエリの特定の推奨事項の後に、列が関数を渡された場合、MySQLはインデックスを適用できないことに注意してください。あなたは* _endとnext_ *列の周りのUNIXTIMESTAMPCONCATの呼び出しを取り除く必要があります。 1つのアプローチは、表のスキーマを変更することです。列をタイプDATETIMEまたはTIMESTAMPの「終わり」および「次の」列に結合します。もう1つは、現在の時刻を日付と時刻に分け、それを使って列を別々に比較することです。

1

explainをご覧ください。これは、ボンネットの下で起こっていることを教えてくれます。

1

おそらく、2つのフィールドの代わりにdatetimeフィールドを使用します。これは、クエリで不必要なデータ変換を省略します。

日付に基づいてテーブルを分割しないと、それよりもずっと良いとは思わないでしょうか。

0

これは、DBスキーマを変更せずにクエリのパフォーマンスを少し向上させるはずだと思います。

SELECT id, name, title, description, time FROM entity 
WHERE NOW() BETWEEN ADDTIME(next_date, next_time) AND ADDTIME(date_end, time_end) 

実は、BETWEEN>=<=と比較します。そのようにしたくない場合は、BETWEENの代わりに><の比較を行ってください。

2

あなたのクエリを処理するためだけの10k記録と罰金になりますが、それは任意の型変換を伴わないとして、これは、より効率的にする必要があります -

SELECT id, name, title, description, time 
FROM entity 
WHERE (date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME)) 
AND (next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME)) 

(NEXT_DATE、DATE_END)の複合インデックスはまたで役立つはずですEXPLAINを使用して実行計画をチェックすると、最も効果的な索引付けを決定するのに役立ちます。あなたは(date_end、next_date)のインデックスもチェックするべきです。データの分布についてもっと知らなければ、どの人が一番助けになるのかは分かりません。

+0

だから私はあなたが夢中にしたことをしました。インデックス(next_date、date_end)を追加しましたが、何らかの理由で指定したクエリでEXPLAINを呼び出すと、作成したインデックスが使用されていません。 ..? – Jasmine

+0

他の方法でインデックスを試しましたか? [FORCE INDEX](http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)を使用してインデックスを試して、実行計画にどのような影響があるかを調べることができます。 – nnichols