基本的には好みの問題です。(UNIONを使用して)1つまたは2つのテーブルを使用してすべてのデータベースクエリを実行できます。したがって、よりクリーンなモデル構造を持つために2つのテーブルを使用することをお勧めします。必要な画像なので、収入エントリを保存します。
- 1つのテーブル:常にタイプを設定する必要があります
- 2つのテーブル:適切なモデルを選択するだけです
しかし、1つのテーブルのみを使用することで(!)より高速になる可能性がある1つのデータベースクエリをイメージできます。
- 両方のタイプが必要な場合
ORDER
は、日付で言いましょう。
そして、1つのテーブルの方が優れているという別のポイントがありますが、それはモデルには当てはまりません。
- タイプが無限にある場合。または:タイプの数が変わる可能性がある場合。
他のすべてについては、2つの別々のテーブルの方が適しています。クエリのパフォーマンスについて:
- テーブルが非常に大きくなり、たとえばすべての収入エントリを取得したい場合は、もちろん、600000エントリのテーブルよりも300000エントリのテーブルでそれらのエントリを検索する方が高速です。
DBMSを詳しく見ると、2つのテーブルを使用するもう1つの理由があります。
- テーブルロック。一部のデータベースエンジンは、書き込み操作のためにテーブル全体をロックします。したがって、データの半分だけがロックされ、残りの半分は同時にアクセスできます。
ORDER
2つのテーブルがあるものを見ていきます。たぶん私は間違っていて、パフォーマンスへの影響はそこにもありません。
結果:
(MySQLを使用して)3つの単純なテーブルを作成しました。
inc
:id
(int、PK)、money
(int、nullではない)
exp
:id
(int、PK)、money
(int、nullではない)
combi
:( id
int、PK)、type
(tinyint、index、not null)、money
(not null)
次に、テーブルにランダムデータを入力します。
money
:1から10000まで
type
:1から2
inc
:100000エントリ
exp
:100000エントリ
combi
:200000エントリ
次のクエリを実行します。
SELECT id, money
FROM combi
WHERE money > 5000
ORDER BY money
LIMIT 200000;
0.1秒...インデックスなし:0.1秒
SELECT * FROM (
SELECT id, money FROM inc WHERE money > 5000
UNION
SELECT id, money FROM exp WHERE money > 5000
) a
ORDER BY money LIMIT 200000;
0.16秒
SELECT id, money
FROM combi
WHERE money > 5000 && type = 1
ORDER BY money
LIMIT 200000;
0.14秒...インデックスなし:0,085秒
SELECT id, money
FROM inc
WHERE money > 5000
ORDER BY money
LIMIT 200000;
0,04秒
そして、あなたは期待される結果を見ることができます:
- 1つのクエリで収入と支出が必要な場合は、1つのテーブルの方が高速です
- 収入または支出のみが必要な場合は、2つのテーブルの方が高速です
しかし、私が理解していないこと:なぜクエリがtype = 1
非常に遅いのですか?インデックスを使用すると、ほぼ同等の速度になると思いましたか?