MySQL:将一个表拆分为多个表(相同的列)以提高性能?

时间:2009-12-04 22:43:33

标签: sql mysql performance multiple-tables

这个问题与性能有关,与可能的解决方案无关。

我的系统包含许多不同类别的项目。每个类别都有自己的表格,因为每个表格都有很多行且字段不同。

ItemA - id, fld1, fld2
ItemB - id, fld1, fld3, fld4
ItemC - id, fld1, fld3, fld5
....

现在需要管理用户库存,这意味着用户有一个项目。一种选择是使用单个表:

Inventory - category_id, item_id, user_id
对于ItemA,ItemB,......行,

category_id是不同的,这就是我们区分的方式。

第二个选项是:

InventoryA - item_id, user_id
InventoryB - item_id, user_id
...

第一个选项可能是最容易管理但是库存表很大(数量级:所有类别的项目数乘以用户数)并经常更新和经常查询。

第二个选项将更难管理(因为我们为每个类别创建一个新的库存表),但可能会带来性能提升,因为它可能会阻止竞争条件。没有单个查询可能需要涉及多个库存表,因为类别是相当分离的。

目前系统使用MySQL和InnoDB引擎。 有大约10个类别,但预计在不久的将来会增长到几十个。最大的类别有> 200k项目,大部分都有> 10k项目。 单个库存表具有>随着越来越多的用户加入,预计会有10M行增加。

我知道最好的方法是测试两种方法的性能并做出决定,但事实是,转移到多表设计不会那么快速和轻松。

如果您有类似问题的个人经历,请分享。

谢谢

2 个答案:

答案 0 :(得分:4)

规范化数据库通常对性能和可维护性更好。

这种方法会创建一个表Items,它与ItemA,ItemB等具有1:1的关系。然后,您可以创建一个与基础{{1}有关系的Inventory表。 } table。

根据documentation,InnoDB支持行级锁,因此不需要使用多个表来防止死锁。

答案 1 :(得分:1)

这是我对这个故事的看法,希望这有点帮助。

  • 项目表包含所有项目共有的字段。
  • 类别(A,B,C)表格具有特定于每一个的字段。
  • 一个用户有很多项目,许多用户可以使用一个项目。

    inventory_model_01