2012-01-26 2 views
0

もっと速いでしょう。主キー特定の文字列Pythonで特定の行のSQLite3テーブルを検索するか、Pythonを使用する方が速いですか?

OR

に等しい行のsqlite3のデータベーステーブルを検索し、私は(クエリを使用)sqlite3のデータベーステーブルからのすべての主キーを取得するPythonのリストとして、およびキーワードにPythons を使用して、特定の文字列がそのリスト内に存在するかどうかをテストします。

SQLite3は、私が検索しているプラ​​イマリキーを持つ特定の行を見つけるために、より高度なアルゴリズムを採用していますか?一度私は自分のバイナリ検索を取得します)いずれかの方法を実行する

コード:

import sqlite3 
conn = sqlite3.connect("d.db") 
cur = conn.cursor() 
isPresent = cur.execute("SELECT target FROM stringList WHERE target='specificString';").fetchall() 
return isPresent == None 

// Alternate 
primaryKeyList = cur.execute("SELECT target FROM stringList;").fetchall() 
return 'specificString' in primaryKeyList 

// Or I can sort the list then use a binary search or other fast algorithm 
primaryKeyList = cur.execute("SELECT target FROM stringList;").fetchall() 
//..sort primaryKeyList 
primaryKeyList = sortList(primaryKeyList) 
return binarySearch('specificString') == True 

PS:私は行が中に格納したいどのような順序でSQLite3のを伝える方法はありますか?だから私はいつもテーブルの行をアルファベット順に並べ替えることができます(プライマリキーに従って)。

答えて

3

"それはもっと速くなるのですか?"質問は「自分でテストする」ことです。

答えは、SQLiteのインデックス検索は、SQLiteのテーブルスキャンとPythonのO(N)スキャンよりも高速になるということです。

「SQLiteに行を格納する方法を教えてください」ビットについては、その必要はありません。 ORDER BYを実行して特定の順序で結果を取得することができます。つまり、が格納された方法は、の実装の詳細です。

+0

ええと、SQLiteのテーブルスキャンがその集中型であるかどうかわかりません。1.自分自身にとっては、3つのテーブルしかないので、あまり集中的ではありません。 2.ヘッダーにテーブルXの位置を保存してから、ファイル/データベースを開き、fseek()(C++)を使用してその位置に移動します。私はSQLiteがファイルをどのようにフォーマットするのかわかりませんが、テーブルの参照にはこのメソッドが必要です。あなたは、テーブルスキャンが実際にそのメモリ集中型であると確信していますか? –

+3

@ JakeM:SQLiteのスキャンに時間がかかりすぎたり、メモリを大量に消費するとは言いませんでした。そうではありません。索引から* 1つの行*を検索するよりも高価になります。再:SQLiteファイルの 'fseek'ing:しないでください。本当に、しないでください。 SQLiteの人々は、あなたのためにマイクロ最適化を行う仕事に怒っています。そして、あなたがそれを必要としていることを知る前に、そのようなことをすることは決して考えてはいけません。 – Borealid

+0

ボレアリドを聞く。行検索のためのインデックスを使用するだけです。 – rabra

関連する問題