複数のビットフィールドを格納する必要がある MySQL テーブルがあります...
- notification.id -- 自動番号 int
- association.id -- ビット フィールド 1 -- 1 つまたは複数のアソシエーション ID (別のテーブルから取得) を格納します。
- type.id -- ビット フィールド 2 -- この通知に適用される 1 つ以上のタイプを格納します (これも別のテーブルから取得)
- notification.day_of_week -- ビット フィールド 3 -- 1 つ以上の曜日を格納します
- notification.target -- 通知の送信先 -- データ型は関係ありません。このフィールドでインデックス付けや並べ替えを行うことはありませんが、おそらく電子メール アドレスを保存することになるからです。
ユーザーは、1 つまたは複数のタイプに対して、1 つまたは複数の関連付けで、1 つまたは複数の日にトリガーされるように通知を構成できます。このデータを格納するための迅速でインデックス可能な方法が必要です。
ビット フィールド 1 と 2 は、現在よりも多くの値を持つように拡張できます。現在、1 には 125、2 には 7 という高い値がありますが、どちらもさらに高くなると予想されます。
ビット フィールド 3 には曜日が格納されるため、可能な値は常に 7 つだけです。
特定の通知を送信する必要があるかどうかを判断するために、タイプ、関連付け、および日に基づいてこのテーブルをスキャンするスクリプトを頻繁に (数分ごとに) 実行する必要があります。クエリは高速である必要があり、新しいデータを簡単に追加できるほど優れています。必要に応じて結合やサブクエリなどを使用することはありませんが、これらがより高速になるとは想像できません。
最後の要件 - ここに 1000 の異なる通知が保存され、125 の関連付けの可能性、7 つのタイプ、および 7 つの曜日がある場合、単に整数を使用し、ビットフィールドを使用する代わりに行を使用するため、ビットフィールドを使用することが要件のようです。
ただし、私が聞いたところによると、特定の曜日、たとえば火曜日 (ビット フィールドの b0000100 など) からすべてを選択したい場合、ビット フィールドはインデックス化されていないため、実行できません...
SELECT * FROM \`mydb\`.\`mytable\` WHERE \`notification.day_of_week\` & 4 = 4;
私の理解では、これはインデックスをまったく使用しません。
インデックス可能な方法でこれを行う方法、または同様の方法について何か提案はありますか?
(私はかなり標準的な LAMP スタックに取り組んでおり、MySQL のインデックス作成がこれまたは同様の代替手段でどのように機能するかについての詳細を探しています。)
ありがとう!