結果の行列をBLOB
としてsqlite3データベースに格納する高価なシミュレーションを実行します。この行列は、特定のtemperature
でシミュレートされた物理システムの量を表し、ある特定のboundary_condition
と特定の行列サイズsize
のものです。さらに、私はシミュレーションを終了するのに常にconvergence
またはnumber_of_steps
のどちらかを使用します。これも保存する必要があります。私はこの行列を必要とする場合、以下のように、私は私のデータベースを照会:複数の接続されたwhere句節を持つクエリの適切な主キーとインデックス[sqlite3]
SELECT * FROM matrices
WHERE temperature = ? AND size = ? AND boundary_condition = ?
AND number_of_steps <= ?
ORDER BY number_of_steps DESC LIMIT 1
それとも
SELECT * FROM matrices
WHERE temperature = ? AND size = ? AND boundary_condition = ?
AND convergence >= ?
ORDER BY convergence ASC LIMIT 1
を今、私は何主キーまたはインデックスを持っていません。ルックアップが少し遅くなってきたので、毎回フルテーブルスキャンを行っていることが分かりました。私は周りを見渡して(temperature, boundary_condition, size)
の複合主キーが適切であり、number_of_steps
とconvergence
のインデックスはk log(N)
の複雑さをもたらし、N
は出力のサイズであり、k
は出力の行であると結論付けました。
これは最適ですか?追加の複雑さは、そのような複合主キーが変更される可能性があるということです。突然、私のシミュレーションに別の必須パラメータを追加する必要がある場合は、主キーを変更する必要があります。これは問題ですか?
これらのインデックスを追加すると、500ルックアップの時間が12秒から0.2秒に短縮されました。 – Kappie001