1

この過度に単純化された例について:

このデータベーススキームでは

+--------------+  +-------------------+
| MASTER_TABLE |  |    FILES_TABLE    |
+-----+--------+  +-----+------+------+
| nID | field  |  | nID | meta | BLOB |
+-----+--------+  +-----+------+------+
|  1  | ...    |  |  1  |  ... | ...  |
+-----+--------+  +-----+------+------+

このようなビューを作成すると、次のようになります。

CREATE VIEW myView AS
SELECT master.*, file.meta 
FROM master_table master
LEFT JOIN files_table file
USING (nid)

クエリ時に未使用の列BLOBが読み取られmyViewますか?(次のように読みます:master_tableのみをクエリするよりも、ビューをクエリする方がはるかに遅くなります)

列BLOBはファイルの保存に使用されるため、これを求めています。そもそもテーブルを2つに分割したのは、master_tableのクエリを高速化するためです。


免責事項:

データ構造を設計する際、プロジェクトマネージャは、データに添付されたファイルをファイルシステムではなくデータベースに保存することを決定しました。

私は、データベースとファイルシステムへのファイルの保存に関する多くの熱狂的な議論をよく知っていますが、私が言ったように、それは私によって決定されておらず、決定を変更する力もありません。

4

1 に答える 1

1

いいえ、ビューを構築するクエリに必要なselectにリストされているフィールドのみが「読み取り」です。ただし、結合は、単一のテーブルselectステートメントではなくselect時間に影響します。

ビューでblobフィールドを使用していないため、このヒットは発生しません。

とテーブルnidの両方でインデックスが作成されている場合、パフォーマンスはかなり良好です。masterfile

fileこのビューのJOINでの最適なパフォーマンスは、テーブルに(nid、meta)の複合インデックスがある場合です。これは、メタが複合インデックスの一部になるには大きすぎないことを前提としています。

于 2012-11-20T21:00:40.687 に答える