SQLクエリを最適化しようとしています。問題はそれが非常に遅いということです!私はsqliteと中規模のデータセット(20000row)で作業しています。私のSQL構文は次のようになります。
SELECT DISTINCT date(A.last_update) as lastUpdate,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = 1) AS valid,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = 0) AS invalid,
(SELECT COUNT(*) FROM bgp_update AS B WHERE date(B.last_update) = date(A.last_update) AND B.validity = -1) AS notFound
FROM (SELECT DISTINCT last_update FROM bgp_update ORDER BY last_update) AS A WHERE last_update BETWEEN '%var' and '%var2';
以下は私が持っているものの例です:
id | last_update | Validity
48 | 2009-1-6 18:34:38 | notFound
47 | 2009-1-6 18:34:38 | valid
46 | 2009-1-6 18:34:38 | valid
45 | 2009-1-3 18:34:38 | invalid
44 | 2009-1-3 18:34:38 | invalid
42 | 2009-1-4 18:34:38 | notFound
41 | 2009-1-4 18:34:38 | notFound
48 | 2009-1-4 18:34:38 | valid
そして、クエリ結果は次のようになります。
Date | valid | invalid | notFound
2009-1-3 | 0 | 2 | 0
2009-1-4 | 1 | 0 | 2
2009-1-6 | 2 | 0 | 1
それから線グラフを生成するためにこれが必要です。例は次のようになります。折れ線グラフ!
しかし、私が言ったように、クエリは非常に遅いです!どうすれば速くできますか?
::::2.編集:::::
前の説明では、問題を単純化しました。私のテーブル作成ステートメントは次のようになります。
CREATE TABLE bgp_update
(id INTEGER PRIMARY KEY,
ip VARCHAR(64) NOT NULL,
mask INTEGER NOT NULL,
asn INTEGER NOT NULL,
validity INTEGER NOT NULL,
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
ご覧のとおり、私のクエリではlast_updateフィールドとvalidityフィールドのみを使用しています。