1

数億行の sqlite テーブルがあります。

sqlite> create table t1(id INTEGER PRIMARY KEY,stuff TEXT );

整数の主キーでこのテーブルを何億回もクエリする必要があります。私のコード:

conn = sqlite3.connect('stuff.db')
with conn:
    cur = conn.cursor()
    for id in ids:
        try:
            cur.execute("select stuff from t1 where rowid=?",[id])
            stuff_tuple = cur.fetchone()
            #do something with the fetched row
        except:
            pass #for when id is not in t1's key set

ここで、ids は数万の要素を持つリストです。t1 の形成にそれほど時間はかかりませんでした (つまり、1 秒あたり ~75K の挿入)。私が行った方法で t1 をクエリすると、容認できないほど遅くなります (つまり、10 秒で ~1K のクエリ)。

私はSQLにまったく慣れていません。私は何を間違っていますか?

4

2 に答える 2

1

キーで値を取得しているため、この場合はキー/値ストアがより適切であるように思われます。リレーショナル データベース (Sqlite を含む) は確かに機能が豊富ですが、単純なキー/値ストアのパフォーマンスに勝るものはありません。

いくつかの選択肢があります:

  • Redis : 「高度なキー値ストア」、非常に高速、メモリ内操作用に最適化
  • Cassandra : 非常に高性能でスケーラブルで、複数の有名なサイトで使用されています
  • MongoDB : 機能が豊富で、リレーショナルと NoSQL の「中間」になろうとしています (そして、無料のオンライン クラスの提供を開始しました) 。

にもたくさんあります

于 2012-11-20T06:26:12.390 に答える
0

代わりに 1 つの SQL 呼び出しを行う必要があります。より高速にする必要があります。

conn = sqlite3.connect('stuff.db')
with conn:
    cur = conn.cursor()

    for row in cur.execute("SELECT stuff FROM t1 WHERE rowid IN (%s)" % ','.join('?'*len(ids)), ids):
        #do something with the fetched row
        pass 

データベースにない ID は表示されないため、試す必要はありません。結果に含まれていない ID を知りたい場合は、次のようにします。

ids_res = set()
for row in c.execute(...):
    ids_res.add(row['id'])
ids_not_found = ids_res.symmetric_difference(ids)
于 2012-10-25T04:08:47.513 に答える