使用两个索引对mysql表进行水平分区

时间:2012-10-13 14:30:12

标签: mysql database-partitioning horizontal-scaling

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

  • id(int,pk)
  • userId(int)
  • itemId(int)
  • 评级(浮动)
  • timestamp(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查询时,当我们从userId查询时,我们从tbl_rating_by_user_userId读取。缺点是每当我想插入或删除评级时,我需要插入或删除两个表。

还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试过编制索引?创建两个复合索引

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

可能有助于提高绩效。

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