3

さまざまなアイテムのユーザー評価を格納する mysql テーブルがあります。次のフィールドがあります。

  • id (整数、pk)
  • ユーザー ID (整数)
  • itemId (整数)
  • 評価 (フロート)
  • タイムスタンプ (整数)

および次のインデックス:

  • (userId, rating): 特定のユーザーが評価したすべてのアイテムに関するクエリの場合
  • (itemId, rating): 特定のアイテムを評価したすべてのユーザーに関するクエリ用

このテーブルには 1,000 万行を超える行があります。よりスケーラブルにするために、水平分割を実行したいと思います。特に、テーブルを 20 個のテーブルに分割する予定です。

  • tbl_rating_by_item_0: itemId が 0 で終わる店舗評価
  • tbl_rating_by_item_1: itemId が 1 で終わる店舗の評価
  • ……
  • tbl_rating_by_item_9: itemId が 9 で終わる店舗評価

  • tbl_rating_by_user_0: userId が 0 で終わる評価を保存します
  • tbl_rating_by_user_1: userId が 1 で終わる評価を保存します
  • ……
  • tbl_rating_by_user_9: userId が 9 で終わる評価を保存します

itemId でクエリを実行する場合は tbl_rating_by_item_itemId から読み取り、userId でクエリを実行する場合は tbl_rating_by_user_userId から読み取ります。欠点は、評価を挿入または削除するたびに、2 つのテーブルに挿入または削除する必要があることです。

他の解決策はありますか?

4

1 に答える 1

0

索引付けは試しましたか?2 つの複合インデックスの作成

 INDEX name1 (rating,userid)
 INDEX name2 (rating,itemId)

パフォーマンスの向上に役立つ場合があります。

テーブルのパーティション分割も検討してください。これは、2つの別個のテーブルを物理的 に作成するよりも優れています。

于 2012-10-17T14:03:05.030 に答える