私はデータベースを取り込んで、それを使用してユーザーが望むものに基づいてグラフを作成するソフトウェアを持っています(主にフォームのクエリSELECT AVG(<input1>) AS x, AVG(<intput2>) as y FROM <input3> WHERE <key> IN (<vals..> AND ...
)。これはうまく機能します。
それぞれが行を記述している(多くの場合、多数の)ファイルを渡す単純なスクリプトがあります
name=foo
x=12
y=23.4
....... etc.......
スクリプトは各ファイルを調べ、変数名とINSERT
それぞれのクエリを保存します。次に、変数名をロードし、sort | uniq
それらからCREATE TABLE
ステートメントを作成します (面白いことに、sqlite は、NUMERIC
実際にはテキスト データが含まれている場合でも、すべての列が であっても問題ありません)。これが完了すると、INSERTS
(単一のトランザクションで実行されます。それ以外の場合は時間がかかります)。
パフォーマンスを向上させるために、各行に基本的なインデックスを追加しました。ただし、これによりデータベースのサイズが大幅に増加し、中程度の改善しか得られません。
データには、次の 3 つの基本的なタイプがあります。
- プログラムのバージョンなどを示す単一の値。
- いくつかの値 (<10)、使用された入力パラメータなどを示します
- 多くの値 (>1000)、主に出力データ。
最初のタイプはソートされないため、明らかにインデックスは必要ありません。2 番目のタイプには、一般的にフィルター処理されるため、インデックスが必要です。3 番目のタイプは、出力で使用されるため、おそらくインデックスは必要ありません。データベースに入れる前に特定の値がどの型であるかを判断するのは面倒ですが、それは可能です。
私の質問は 2 つあります。
- 私が見たサイズの増加を超えて、余分なインデックスへの隠れたコストはありますか?
- フォームのフィルタリングクエリのインデックスを作成するより良い方法はあり
WHERE foo IN (5) AND bar IN (12,14,15)
ますか? ユーザーがどの列を選択するかはわかりませんが、それがタイプ 2 の列になることはありません。