3

我有一个 mysql 表,用于存储不同项目的用户评分。它具有以下字段:

  • id (int, pk)
  • 用户 ID(整数)
  • itemId (int)
  • 评级(浮动)
  • 时间戳(整数)

和以下指数:

  • (userId, rating):用于查询特定用户已评分的所有项目
  • (itemId, rating):用于查询所有对特定项目进行评分的用户

该表有超过 1000 万行。为了使其更具可扩展性,我想执行水平分区。特别是,我计划将表分区为 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结尾的评分

这个想法是,当我们从 tbl_rating_by_item_itemId 中读取 itemId 查询时,我们从 tbl_rating_by_user_userId 中读取 userId 查询。缺点是每当我想插入或删除评分时,我都需要在两个表中插入或删除。

还有其他解决方案吗?

4

1 回答 1

0

你试过索引吗?创建两个复合索引

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

可能有助于提高性能。

还要考虑表分区。看看Mysqlable partitioning 这比物理上创建两个单独的表要好。

于 2012-10-17T14:03:05.030 回答