エントリの更新と同じように列の並べ替えとフィルタリングを処理できる高速データベーススキーマを設計したいと思います。
このために、次のシナリオを作成しました。
- イベントには、名前、ステータス、最終サブスクリプション日、説明、場所が1つだけあります。
- イベントの空席数はイベントとともに保存され、参加者がサブスクライブするたびに更新されます
- すべてのイベントには1つのカテゴリがあります
- イベントはカテゴリ別にのみ一覧表示できます
- イベントは、名前、ステータス、または日付でフィルタリングできます(xorなし)
- イベントは、名前、ステータス、または日付で並べ替えることができます(xor)
- テーブルは10を超えるmioエントリを処理する必要があります
すべてのテストで、MySQLテーブルとInnoDBテーブルを使用しました。また、できるだけ頻繁に複数の挿入/更新/削除を使用しようとしました。フィルタリングは、LIKE'%[word]%'を使用して行われます。
最初に、2つのテーブルを使用しようとしました。1つはカテゴリ用、もう1つはイベント用です。インデックスは、category-name、category-status-name、category-date-name、category-date-status-nameでした。このため、リスト、フィルタリング、および並べ替えは非常に高速でしたが、エントリの挿入、更新、または削除は非常に低速でした。インデックスの再構築に時間がかかりすぎたため、ロックタイムアウトも発生しました。
2番目の試みは、カテゴリ、イベント、場所の3つのテーブルを用意することでした。ただし、ロケーションテーブルに6 mio以上のエントリが含まれている場合も、速度が低下します。速い漁獲量の指標があるからだと思います。10万エントリの追加には約272秒かかります。場所のインデックスは、primary- indexidとzip-streetでした。
次の試みは、last-subscription-dateとカウンター用の独自のテーブルを作成することです。しかし、この日付をフィルタリングしたり、これを並べ替えたりする可能性についてはどうでしょうか。
カテゴリ名、カテゴリ日付、カテゴリステータスのような3つのインデックスがある方が良いですか、それとも4つのインデックスカテゴリ名、カテゴリステータス名、カテゴリ日付名、カテゴリ日付ステータスのソリューションです。 MySQLに適した名前を付けますか?
フィールドタイプについても考えています。現在、名前にVARCHARを使用しています。ただし、すべてのエントリの長さが同じであるため、可変長を使用するよりもインデックス内の特定の位置にジャンプする方が高速であるため、CHARの方が適している可能性があります。どう思いますか?
上記のシナリオをサポートする、優れた高速データベーススキーマを設計するためのヒントがありますか?