Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL InnoDB设计问题_Mysql_Database Design_Innodb - Fatal编程技术网

MySQL InnoDB设计问题

MySQL InnoDB设计问题,mysql,database-design,innodb,Mysql,Database Design,Innodb,希望有一个简单的问题: 1)创建一个包含数万个条目的“文档”表,还是2)将它们拆分为几个“文档类型”表更好 例如,1)包含用户id、文档类型和文档名称列的“文档”表,或2)包含用户id和文档名称列的单独“文档类型”表 无论哪种情况,我们都要处理成千上万的条目 我的直觉告诉我,与选项2相比,选项1可能会导致显著的性能损失 谢谢 如果索引正确,第一个选项的性能应该不会太差。听起来您可能想为文档名称编制索引,然后可能是其他字段之一。这在某种程度上取决于插入和查询的数量;如果插入很少,您可以负担更多的索

希望有一个简单的问题:

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
唯一一类变得更糟糕的查询是“搜索所有文档的所有属性”。由于行长度较小,几乎所有其他用法平均而言都会变得更快,每个子类一个表(平均而言,缓存中可以容纳更多行,并且每次磁盘读取都会返回更多行)