2017-07-28 6 views
0

の更新をスピードアップするために私は私のディスク上に.dbファイルとして格納するデータベースを、持っています。 sqlite3を使用してこのデータベースを管理するために必要なすべての機能を実装しました。しかし、私はテーブルの行を更新するには時間がかかります。私のデータベースは現在608042行あります。データベースには1つのテーブルがあります - Table1としましょう。このテーブルには、次の列からなる:パイソン:sqlite3の - どのようにデータベース

id | name | age | address | job | phone | income 

id値がautomaticaly生成される行がデータベースに挿入された状態)。 は読取のすべての行後、私はそれぞれ608042のために、私は(行ごとに)このようincome(の値を更新する必要が次の行からの値に(収入を予測するためのMLアルゴリズム)いくつかの操作を行い、行は私がSQL update操作を実行します)。 更新するために、私は(私のクラスからコピーされた)次の関数使用しています:

def update_row(self, new_value, idkey): 
    update_query = "UPDATE Table1 SET income = ? WHERE name = ?" % 
    self.cursor.execute(update_query, (new_value, idkey)) 
    self.db.commit() 

をそして私は、データベースに登録されたそれぞれの人のために、この関数を呼び出します。

for each i out of 608042 rows: 
    update_row(new_income_i, i.name) 

(new_income_iの値はiごとに異なります)。 データセットが巨大ではないにもかかわらず、これには膨大な時間がかかります。データベースの更新を高速化する方法はありますか? sqlite3以外のものを使用する必要がありますか?または、データベースを.dbファイルとして保存する代わりに(sqlite3.connect(":memory:")を使用して)メモリに格納する必要がありますか?

+1

'name'カラムにインデックスを作成しようとしましたか、あるいは' id'を使ってそれらのレコードを更新しようとしましたか? 'name'が各行に対して一意であれば、' name'列にユニークなインデックスを作成することもできますが、 'id'を使うのは文字列以外の数値なので高速でなければならないと思います。 –

+0

@JoeyZhang Idは一意ですが、名前は必ずしも必要ではありません。このインデックスが何をしているのか、それがどのように役立つのかを少し教えてください。 – Ziva

+1

「データベースのインデックス作成の仕組み」を参照してください。 https://stackoverflow.com/questions/1108/how-does-database-indexing-work –

答えて

1

各UPDATE文には名前が一致するすべての行(複数可)を見つけるために、テーブル全体をスキャンする必要があります。

これを防ぎ、はるかに高速に検索を行うだろうname列に索引。 (Query PlanningHow does database indexing work?を参照してください)

name列が一意でない場合は、その値は、個々の行を見つけることさえも適していません:重複した名前を持つ各アップデートは同じ名前を持つすべての行を変更します。更新する行を特定するには、id列を使用する必要があります。主キーとして、この列にはすでに暗黙的な索引があります。

+0

explanaitionありがとう! – Ziva

関連する問題