2011-11-14 3 views
1

私は10000 IDの大きなデータベースを持っています データベースから名前を検索すると時間がかかりますが、最短時間を短縮する方法が必要ですか? ? 私はこの方法を使用しています:pythonの大きなデータベースから検索する時間が短くなります

while (query.next()): 
       line3 = self.lineEdit_4.text() 
       query.exec_("SELECT * FROM test WHERE name LIKE '%s';" % ("%"+line3+"%")) 
       model = QSqlTableModel() 
       model.setQuery(query) 
       model.select() 
       self.tableView.setModel(model) 

答えて

4

ああ、待ってください。元の答えは以下ですが、コードを見ると結果のすべての行についてクエリを再実行しているようです。

最初にqueryを作成して入力する文の上に、whileのコードを表示する必要があります。

オリジナルの答え:あなたの検索用語の開始でワイルドカード文字を持っているので、

の検索インデックスを使用してoptizableではありません。

  1. は、検索の先頭からワイルドカードを削除し、名前(どこにも名前ではない文字)の最初の数文字を入力することをユーザに要求:あなたは、次の操作を行うことができます。 name列に索引があることを確認する必要があります。

  2. 追加の基準を適用して、SQL文で検索する必要がある名前の数を制限します(たとえば、ポストコードなど)。検索している他の列にインデックスがあることを確認する必要があります。

  3. フルテキストインデックス作成と検索のユーザーを調べます。

これは実際にはPythonやQTの質問ではなく、クエリを送信しているどのSQLデータベースにも関係する質問です。

最後に、ユーザーが入力した名前にアポストロフィ(たとえば、O'Reillyという名前)が含まれており、SQLインジェクション攻撃の危険がある場合、コードは失敗します。次のようなパラメータ化クエリに切り替える必要があります(特にPyQTインターフェイスはわかりません)。

query.exec_("SELECT * FROM test WHERE name LIKE ?;" ("%"+line3+"%")) 
関連する問題