我正在与一个试图实施EAV系统的团队合作。他们决定将属性值表划分为类型,他们正在使用不同的表格对VARCHAR的不同表进行辩论。

前任:

  • table_1-到varchar(10)
  • table_2 -varchar(11)到varchar(500)
  • table_3- varchar(501)到varchar(最大)

我一直都有这样的印象 Varchar 只能使用所需的大小。

您知道这是否会在性能方面取得任何收益,是否值得需要的额外编码 /逻辑?

有帮助吗?

解决方案

我的直觉说,您获得的任何绩效增长都不太可能值得额外的麻烦(并且可能导致错误),这是由于需要执行分离并在应用程序逻辑中执行多个查找而导致的。

如果您的价值很小,并且 只要 查询它们和 没有任何 在其余部分中,您会看到一些性能增长,因为更多的行适合每个页面,因此总体上需要在RAM中处理较少的页面或从磁盘中读取给定查询。一旦您需要一口气(或只是混合),就需要通过单独查询多个表或通过联合来查询多个表,就会从水中吹出。

当然,唯一确定的方法是操纵一个相当现实的大数据集,并根据您正在考虑的安排进行一些绩效测试。但是我非常怀疑您会看到任何变化值得额外的复杂性。如果您的数据可以以更合乎逻辑的方式(即您的业务逻辑暗示的方式)进行分配,那么我建议您研究数据分区,尤其是如果您可以将分区分配在不同的驱动器上。每当您发现自己正在考虑采用潜在的复杂性优化(包括分区)时,请始终回去重新考虑您的整体数据结构,并确保它不适合您的业务逻辑,并且检查您的硬件足以满足您的期望 - 虽然不是这样 - 保证您可能会通过研究这些核心领域找到更大的收益。

其他提示

您的性能根本没有收益。

快速思考,根本不是详尽的分析:

  • 在某个时候,您需要将它们结合到单个视图,然后一切都变成varchar(最大)
  • 您如何提前决定长度?
  • 索引搜索值?你不能索引> 900字节
  • 在EAV中滚动自己的“唯一”约束将足够糟糕,而不会在多个表上拆分

寻找 EAV抗模式: :有几篇有关如何避免EAV的文章

听起来他们正在尝试优化查找的EAV。但是,这显然听起来好像不是在试图优化一个用于剖析的缺陷的系统,而是他们试图通过Voodoo Guess进行优化。

提醒他们,第一个优化规则是分析,就像大卫·斯皮利特(David Spillett)所说的那样,直到您在EAV中有几亿行(考虑到我所知道的大多数实体,至少是15个属性,所以您只会像一个人一样几万个实体)然后概括了您不知道这会产生任何影响。

我会选择“不,这不会像他们认为会那样受益”,而且更好的分区可能是按50个字符和100个字符的订单,而不是10和500。但这只是一个猜测。


但是请注意,它将具有他们想要的效果,因为它将允许更好的索引性能(所有数据分配都应为非分区提供更好的索引性能作为一般的经验法则)

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top