1

私は lsqlite3 lua ラッパーを使用しており、クエリをデータベースに作成しています。私のDBには約500万行あり、行を取得するために使用しているコードは次のようなものです:

db = lsqlite3.open('mydb')
local temp = {}
local sql = "SELECT A,B FROM tab where FOO=BAR ORDER BY A DESC LIMIT N"
for row in db:nrows(sql) do temp[row['key']] = row['col1'] end

Nご覧のとおり、一番上の行を降順で並べ替えようとしています(一番上の行を取得してから、逆ではなくFOO適用したい)。LIMIT列にインデックスを付けましたAが、大きな違いはないようです。どうすればこれをより速くすることができますか?

4

1 に答える 1

3

フィルタリングする列にインデックスを付ける必要があります (つまり、WHERE 句を使用)。その理由は、フィルタリング後に ORDER BY が機能するためであり、その逆ではありません。

したがって、おそらく FOO にインデックスを作成する必要があります。

テーブルスキーマを投稿できますか?

アップデート

また、次のようにsqlite キャッシュを増やすこともできます。

PRAGMA cache_size=100000

これは、使用可能なメモリとデータベースのサイズに応じて調整できます。

更新 2

クエリが sqlite によってどのように処理されるかをよりよく理解したい場合は、クエリ プランを提供するよう依頼できます。

http://www.sqlite.org/eqp.html

更新 3

最初の回答では、あなたの文脈を正しく理解できませんでした。大きなデータ セットで ORDER BY を実行する場合、おそらく前のインデックスではなくそのインデックスを使用する必要があるため、この方法で FOO のインデックスを使用しないように sqlite に指示できます。

SELECT a, b FROM foo WHERE +a > 30 ORDER BY b
于 2012-04-13T15:42:40.807 に答える