0

ブール属性に基づいてテーブルからレコードを選択する最も効率的な方法を見つけることに興味があります。

私のシナリオは、ユーザーが作成したコメントを保持するテーブルがあり、不適切であるとフラグが付けられたすべてのコメントを選択したいというものです。

これを実装するために必要だった2つのアイデアは次のとおりです。

  1. 最も論理的なもので、コメントテーブルにブール属性「isFlagged」があります

    テーブルにはプライマリ インデックスがあります。

    私は実行します:

    SELECT description FROM Comment 
    WHERE isFlagged = 1;
    
  2. フラグが立てられた Comment テーブルのレコードの主キーを保持するテーブルを用意する

    両方のテーブルにプライマリ インデックスがあります

    私は実行します:

    SELECT description FROM Comment 
    WHERE commentID IN (SELECT FK_commentID FROM FlaggedComment)
    

最も効率的に実行できるのはどれですか?

これを行うより良い方法はありますか?

4

2 に答える 2

1

isFlaggedフィールドにインデックスがある場合に限り、最初のものを選びます。

alter table comment add index idxFlagged (isFlagged)

さらに、2 番目のクエリは単なる結合であることを考慮してください (サブクエリは必要ありません)。

select description from Comment c
join FlaggedComment fc on c.commentId = fc.fkCommentId

isFlaggedフィールドのインデックスをトラバースするよりも実行に時間がかかるはずです。とにかく、これら 2 つのソリューションのベンチマークを行い、結果を報告することをお勧めします :)

于 2012-04-13T01:45:20.917 に答える
0

パフォーマンスが懸念される場合は、代表的な量の(テスト)データを使用して、両方のシナリオをテストすることをお勧めします。

ほとんどのデータベースシステムは、カーディナリティの低いフィールド、特にブール値のインデックスの恩恵を受けていません。巨大なテーブルの場合、オプション1ではテーブルスキャンが必要になりますが、これは時間がかかる可能性があります。

コメントIDフィールドにインデックスを付けることができるため、オプション2の方が高速ですが、言及したクエリに対してのみです。個々のコメントに関する詳細を検索しようとすると、結合が必要になり、処理が遅くなる可能性があります。

実際には、極端な作業をしているのでない限り、パフォーマンスに測定可能な影響を与える可能性はほとんどありません。そのため、テストリグを作成して試してみる必要があります。理論上の違いは、実際には影響を与えない可能性があります。

于 2012-04-13T09:45:51.413 に答える