【发布时间】:2014-05-29 17:29:56
【问题描述】:
想象一个假设的数据库,它存储产品。每个产品都有 100 个属性,尽管任何给定的产品只会为其中约 50 个属性设置值。我可以看到三种存储这些数据的方法:
100列的单表,
一个表很少(比如每个产品都有一个值的 10 列),另一个表有列(product_id、attribute、value)。即,EAV 数据存储。
每列都有一个单独的表。所以核心产品表可能有 2 列,另外还有 98 个其他表,每个表都有两列(product_id、value)。
撇开这些极端之间的灰色阴影,从纯粹的效率角度来看,哪个最好用?我假设它取决于正在运行的查询类型,即,如果大多数查询是针对产品的多个属性,还是针对多个产品的单个属性的值。这对效率有何影响?
假设这是一个使用 InnoDB 的 MySQL 数据库,并且所有表都有适当的外键,以及 product_id 上的索引。假设属性名称和值是字符串,并且没有索引。
一般来说,我问的是访问一个非常大的表是否比具有许多连接的查询花费更多或更少的时间。
我在这里发现了一个类似的问题:Best to have hundreds of columns or split into multiple tables?
不同之处在于,该问题询问的是特定情况,并没有真正告诉我一般情况下的效率。其他类似的问题都在说组织数据的最佳方式,我只是想知道不同的组织系统是如何影响查询速度的。
【问题讨论】:
-
Donald Knuth:过早的优化是万恶之源。
-
最有可能的折衷方案 - 有很多表格会更有效率,而有单个表格会更有效率。
-
您说,“我只是想知道不同的组织系统如何影响查询速度。”一般经验法则,涉及的表数越多,查询时间越长;因为数据库必须生成连接的结果。而如果它在一个表中,则关系已经定义。如果空间不是问题,并且您没有选择 * 从表中获取所有记录,则在大多数情况下,1 个表应该是最佳性能。不过也有例外。
-
@Barmar 热爱过早优化是万恶之源
标签: mysql database-design