2012-04-06 4 views
0

私は例えば、last secodsを選択クエリを作っ:30:今、それは10だ場合は30代と私はlast 20 secondsを渡し、それが唯一の10:30:1010:30:30間の値を返す必要がありますので、ここにある:タイムスタンプについてSELECTを改善するには?

public List<Log> listLastSeconds(Integer id_point, int seconds) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.SECOND, -seconds); 

    Date today = new Date(); 
    Date lastSeconds = calendar.getTime(); 

    Query query = em.createQuery("SELECT l FROM Log l WHERE l.point.id =:id AND l.time >= :lastSeconds AND l.time <= :today", Log.class); 
    query.setParameter("id", id_point); 
    query.setParameter("lastSeconds", lastSeconds); 
    query.setParameter("today", today); 

    return query.getResultList(); 
} 

しかし、このクエリーは、わずかな差異(10秒など)でも長すぎます。

EDIT:

CREATE TABLE `log` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_point` int(11) NOT NULL, 
    `value` varchar(10) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `fk_point_id` (`id_point`), 
    CONSTRAINT `fk_point_id` FOREIGN KEY (`id_point`) REFERENCES `point` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=9360244 DEFAULT CHARSET=latin2$$ 

どうすればもっと速くなるように、このクエリを向上させることができますか?

+0

あなたのテーブルはどのように見えますか?どのように索引付けされていますか? 'EXPLAIN SELECT ... 'の結果を表示することも役に立ちます。 – Wiseguy

+0

ここでは、JPAプロバイダが電信で送信しているSQLをキャプチャし、['EXPLAIN'](http://dev.mysql.com/doc/refman/5.0/en/explain.html )クエリ。結果をここに掲示し、より良い回答を得る可能性があります。 – ig0774

+0

@ウィスジー私の投稿を更新してください、どうぞご覧ください。 –

答えて

1

あなたのインデックスにはtime列が必要です。これはそれを行います:

CREATE INDEX time_index using btree on log(time); 
+0

Michael Slade私の投稿を更新しています。どうぞご覧ください。 –

+0

それは解決しました! マイケルに感謝します。 –

0

私はDATE_ADDを使用します。まず、todaylastSecondsの変数を取り除きます。このクエリを使用し、メソッド引数をクエリのパラメータとして設定します。

SELECT l 
FROM Log l 
WHERE l.point.id =:id 
AND l.time >= DATE_ADD(CURTIME(), INTERVAL :seconds SECOND) 

私はそれをテストしたいと思っていますが、現時点ではmysqlにアクセスできません。できるだけ早くテストします:)

ただし、テーブル全体を検索するため、パフォーマンスが大幅に向上することはありません。

作業中のデータの性質を知っている場合、たとえば過去10秒間に追加できる行の数が最も多い場合などは、テーブルIDがmax(id) - Nより大きい場合、これは単なる例であり、検索スペースを制限し、ビジネス上の意味を成す他のインジケータは、実際のパフォーマンスの向上をもたらします。

時間欄のインデックスはオプションですが、それはどれほど実用的か速いのかよくわかりません。誰かがインデックスを使用してコメントを得ましたか?

関連する問題