我目前正在尝试设计一个高性能数据库来跟踪点击次数,然后显示这些点击的分析。
我预计每两周会有至少1000万次点击。
有一些变量(每个变量需要一个唯一的列),我允许用户在使用点击跟踪时使用 - 但我不想将它们限制为其中的一些变量为5左右。这就是我考虑创建表B的原因,我可以为每次点击存储这些变量。
然而,每次点击可能有5-15 +这些变量,具体取决于他们使用了多少。如果我将它们存储在一个单独的表中,该表将通过用户可能使用的变量将10M / 2周复用一次。
为了显示变量的分析,我需要加入表格。
考虑写作和最重要的阅读表现,如果我将一个100M行表加入到:
任何人都建议对其进行非规范化处理,比如有20列并且如果它们没有被使用则存储空值?
答案 0 :(得分:2)
如果我将一个100M行表加入到...中有什么区别
是的。 JOIN的性能仅取决于根据ON条件查找匹配行所需的时间。这意味着增加连接表的行大小将增加JOIN时间,因为有更多行要筛选匹配。通常,JOIN可以被认为是A * B时间,其中A是第一个表中的行数,B是第二个表中的行数。这是一个非常广泛的陈述,因为优化器可能会采用许多优化策略来更改此值,但这可以被视为一般规则。
为了提高JOIN的效率,特别是对于读取,您应该查看indexing。索引允许您标记优化程序应索引的列,或保留运行轨迹以允许更快地评估值。这增加了任何写入操作,因为数据需要修改包含数据结构(通常是B树),但减少了读取操作的时间,因为数据在此数据结构中被预先排序,允许快速查找。
任何人都建议对其进行非规范化处理,比如有20列,如果不使用它们会存储空值?
这里有很多因素可以说是或否。主要是,存储空间是一个问题,重复数据出现的可能性有多大。如果答案是存储空间不是问题并且不太可能出现重复,那么一个大表可能是正确的决定。如果您的存储空间有限,那么存储多余的空值可能并不聪明。如果您有许多重复值,那么一个大表可能比JOIN效率更低。
非规范化时要考虑的另一个因素是另一个表是否只想访问前两个表中的一个表中的值。如果是,则在非规范化之后获取这些值的JOIN比将两个表分开的效率更低。在设计数据库并查看数据库的使用方式时,您需要自己处理这个问题。
答案 1 :(得分:1)
首先:加入10米到500或10米到10米的条目之间存在巨大差异!
但是,使用propper索引和结构化表格设计将使我们能够根据您的目标进行管理。 (至少取决于用于运行应用程序的硬件)
我完全不建议使用非规范化表格,因为一旦你的表格中有20米的条目,添加超过20个值就会变得一团糟。因此,即使有一些很好的理由可能代表使用非规范化表(性能,表空间,......),这对于进一步的更改是一个坏主意 - 但最终你的决定;)