2017-07-19 21 views
3

我目前正在尝试设计一个高性能数据库来跟踪点击次数,然后显示这些点击次数的分析结果。在进行JOIN时,MySQL表的大小是否重要?

我预计每两周至少会有10M次点击。

有几个变量(他们每个人都需要一个独特的列),我会允许人们使用点击跟踪时使用 - 但我不想限制他们到一些这些变量到5或者。这就是为什么我想创建表B,我可以为每次点击存储这些变量。

但是,每次点击都可能有5-15个这样的变量,具体取决于它们使用了多少个变量。如果我将它们存储在一个单独的表格中,用户可能会使用这些变量,这些表格会以10M/2周为单位进行复制。

为了显示变量的分析,我需要加入表格。

望着写入和最重要的读取性能,有什么不同,如果我加入一个100M行表一:

  • 500行的表或到100M行表?

任何人都推荐反正常化它,比如有20列,如果它们没有被使用,那么存储NULL值。

+0

你在考虑数据库完全错误。它只是不能这样工作。这不像你把一个巨大的桶放在另一个巨大的桶上面。相反,你从每个桶中取出一杯水并将它们连接起来。这是索引和数据结构发挥作用的地方。如果您加入两个表格但具有其他条件('WHERE x = y AND z = k'),那么您将加入两个减少的数据集。是的,桌子的尺寸会很重要,但不是你想象的那样。 – Mjh

+0

@Mjh WHERE条件根本不会影响JOIN时序。在JOIN执行后执行WHERE,这意味着即使您有一个没有任何匹配的WHERE,也会发生JOIN。 – yanman1234

+0

@ yanman1234你的回答指出优化器选择了这个策略。这就是我想强调的。答案不是黑色和白色。就像无法设计在未知硬件上运行的性能最好的数据库一样,这一直是限制因素。 – Mjh

回答

2

有什么区别,如果我加入一个100M行表到...

是的,有。 JOIN的性能仅仅基于您的ON条件需要多长时间才能找到匹配的行。这意味着增加连接表的行大小将增加JOIN时间,因为有更多的行要筛选匹配。一般来说,JOIN可以被认为是A * B时间,其中A是第一个表中的行数,B是第二个表中的行数。这是一个非常广泛的声明,因为优化程序可能会采取许多优化策略来改变此值,但这可以视为一般规则。

要提高JOIN的效率,对于具体阅读,您应该查看indexing。索引允许您标记优化程序应该索引的列,或者保持运行轨道以允许更快速地评估值。这会增加任何写入操作,因为数据需要修改包含数据结构(通常是B树),但会减少时间读取操作,因为数据在此数据结构中预先排序以便快速查找。

任何人都推荐非规范化它,比如有20列,如果它们没有被使用,存储NULL值?

有很多因素会在这里说是或否。主要是存储空间是一个问题,重复数据出现的可能性很大。如果答案是存储空间不是问题,并且重复不可能出现,那么一张大表可能是正确的决定。如果您的存储空间有限,那么存储多余的空值可能不明智。如果你有很多重复值,那么一个大表可能比JOIN效率低。

非规范化时需要考虑的另一个因素是,如果另一个表只想访问前两个表中的一个表中的值。如果是的话,那么在非规格化之后获得这些值的JOIN将比分开两个表的效率更低。这个问题实际上是您在设计数据库并查看其使用方式时需要处理的问题。

1

第一:10米到500米或10米到10米之间有巨大的差异!

但是,使用propper索引和结构化表格设计将使您的目标易于管理,我认为。 (至少取决于用于运行应用程序的硬件)

我完全不会推荐使用非规范化表格,因为当您的表格中有20m条目时,添加超过20个值将会变得很糟糕。因此,即使有一些很好的理由可能代表使用非规范化表格(性能,表空间,..),但对于进一步的修改来说这是一个糟糕的主意 - 但在最后你的决定;)

相关问题