MySQL InnoDB设计问题
希望有一个简单的问题: 1)创建一个包含数万个条目的“文档”表,还是2)将它们拆分为几个“文档类型”表更好 例如,1)包含用户id、文档类型和文档名称列的“文档”表,或2)包含用户id和文档名称列的单独“文档类型”表 无论哪种情况,我们都要处理成千上万的条目 我的直觉告诉我,与选项2相比,选项1可能会导致显著的性能损失MySQL InnoDB设计问题,mysql,database-design,innodb,Mysql,Database Design,Innodb,希望有一个简单的问题: 1)创建一个包含数万个条目的“文档”表,还是2)将它们拆分为几个“文档类型”表更好 例如,1)包含用户id、文档类型和文档名称列的“文档”表,或2)包含用户id和文档名称列的单独“文档类型”表 无论哪种情况,我们都要处理成千上万的条目 我的直觉告诉我,与选项2相比,选项1可能会导致显著的性能损失 谢谢 如果索引正确,第一个选项的性能应该不会太差。听起来您可能想为文档名称编制索引,然后可能是其他字段之一。这在某种程度上取决于插入和查询的数量;如果插入很少,您可以负担更多的索
谢谢 如果索引正确,第一个选项的性能应该不会太差。听起来您可能想为文档名称编制索引,然后可能是其他字段之一。这在某种程度上取决于插入和查询的数量;如果插入很少,您可以负担更多的索引。如果数据库设计和索引正确,那么在关系数据库世界中,上万个条目就不多了。如果要创建几个表:,需要考虑的一些事情
- 这将更难维持市场 代码
- 遗嘱的履行 受苦
- 数据完整性不会受到影响 强制执行
编辑:改进的格式设置除非您预计这将增加到数百万条记录和/或插入量很大,否则在任何情况下都没有理由将其拆分为多个表。在数据库中建立索引的目的是解决大型数据集问题 在本例中,假设有90K个条目,其中三种类型各有30K个条目。如果为document_type列编制索引,则选择这三种类型之一的查询的速度几乎与对仅包含30K个相同类型项的表进行选择一样快 此外,由于文档ID很可能是一个基数很高的数字索引,因此假设您对列进行索引(应该是主键),那么在一个有三种类型的90K条目的表上选择特定索引的记录的速度与在一个有一种类型的30K条目的表上一样快
分割数据还有其他原因,但它们与运行复杂查询、事务性插入、表联接等有关。根据我的经验,表格设计师经常觉得需要切分不应该切分的东西,这(正如其他答案所提到的)会导致不必要的复杂性。发展的首要原则:保持简单 我认为拆分表的唯一原因是它是否应该建模为文档的子类 也就是说,而不是:
document
- document_id (pk)
- type
- name
- attribute_x
- attribute_y
- attribute_z
- attribute_a
- attribute_b
- attribute_c
- attribute_1
- attribute_2
- attribute_3
您可以为文档的每个子类创建一个表:
document
- document_id (pk)
- type
- name
document_type_1
- document_id (pk) references document(document_id)
- attribute_x
- attribute_y
- attribute_z
document_type_2
- document_id (pk) references document(document_id)
- attribute_a
- attribute_b
- attribute_c
document_type_3
- document_id (pk) references document(document_id)
- attribute_1
- attribute_2
- attribute_3
唯一一类变得更糟糕的查询是“搜索所有文档的所有属性”。由于行长度较小,几乎所有其他用法平均而言都会变得更快,每个子类一个表(平均而言,缓存中可以容纳更多行,并且每次磁盘读取都会返回更多行)