1

コロナ/ルア アプリ用に sqlite を使用してテーブルを作成しました。~=700 000 の値を持つハッシュテーブルです。テーブルには、ハッシュコード (文字列) と値 (別の文字列) の 2 つの列があります。プログラム中に、ハッシュコードを提供してデータを数回取得する必要があります。

私はデータを取得するためにこのコードのようなものを使用しています:

for p in db:nrows([[SELECT * FROM test WHERE id=']].."hashcode"..[[';]]) do
    print(p) 
    -- p = returned value --
end

このステートメントは、実行するのに非常に時間がかかりすぎますが、

ありがとう、

編集:

成功!間違いは主キーの問題でした。以下のようにハッシュコードを主キーとして設定し、取得時間を通常に設定しました。

CREATE TABLE IF NOT EXISTS test (id STRING PRIMARY KEY , array); 

あなたが言ったように、私も事前に声明を準備しました:

stmt = db:prepare("SELECT * FROM test WHERE id = ?;")
[...]
stmt:bind(1,s)
for p in stmt:nrows() do

唯一の問題は、約 18 MB だった db ファイルのサイズが 29,5 MB になったことです。

4

3 に答える 3

2

id一意の主キーとしてテーブルを作成する必要があります。これにより、自動的にインデックスが作成されます。

create table if not exists test
(
    id text primary key,
    val text
);

文字列連結を使用してステートメントを作成しないでください。これはセキュリティ上の問題であるため、この習慣を身につけないようにしてください。また、プログラムの初期化時に事前にステートメントを準備し、準備されたステートメントを実行する必要があります。

このようなもの...最初は:

hashcode_query_stmt = db:prepare("SELECT * FROM test WHERE id = ?;")

次に、使用ごとに:

hashcode_query_stmt:bind_values(hashcode)
for p in hashcode_query_stmt:urows() do ... end
于 2013-10-24T21:37:37.713 に答える
0

すでに述べたように、ID にインデックスがあることを確認してください。

今すぐテーブル スキーマを変更できない場合は、アドホックにインデックスを追加できます。

CREATE INDEX test_id ON test (id);

ハッシュについて: 検索を高速化するためにソフトウェアでハッシュを計算している場合は、そうしないでください。

SQLite は、提供されたハッシュを通常の文字列/ブロブとして使用します。また、RDBMS は効率的な検索のために最適化されており、インデックスによって大幅に改善される可能性があります。

スペースを節約するためにハッシュしない限り、アプリケーションでハッシュを計算するプロセッサ時間を浪費しています。

于 2013-10-25T08:05:49.700 に答える
0

/hashcode 列にインデックスがあることを確認しますか? idそのようなクエリが 1 つもないと、遅くなり、遅くなり、遅くなります。このインデックスはおそらく一意である必要があります。

値/ハッシュコード ( ) のみを選択する場合は、行データへの追加のシークを回避できるため、カバリング インデックスを使用SELECT value FROM ..すると有益な場合があります (「 SQLite クエリ プランニング」を参照)。このようなカバリング インデックスの有無にかかわらず試してみてください。(id, value)

また、同じハッシュコードが複数回クエリされる場合は、キャッシュを使用する価値があります。

于 2013-10-24T20:21:40.727 に答える