0

たとえば、を選択するクエリを作成しましたlast secods。現在は 10:30:30 で、 を渡すと、 と の間でlast 20 secondsのみ値が返されるはずです。したがって、次のようになります。10:30:1010:30:30

    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 秒などのわずかな違いでも時間がかかりすぎます。

編集:

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$$

このクエリをより高速に改善するにはどうすればよいですか?

4

2 に答える 2

1

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

CREATE INDEX time_index using btree on log(time);
于 2012-04-06T13:58:33.417 に答える
0

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

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

テストしたいのですが、現時点ではmysqlにアクセスできません。できるだけ早くテストします:)

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

作業しているデータの性質について何か知っている場合、たとえば、過去 10 秒間に追加される可能性のある行の最大数はいくつであるかなど、table id is greater than max( という句を追加できます。 id) - いいえ、これは単なる例です。検索スペースを制限でき、ビジネス上意味のある他のインジケーターは、実際のパフォーマンスの向上をもたらします。

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

于 2012-04-06T16:23:26.227 に答える