我有一个相对较大的数据库(130.000+行)的天气数据,它的累积速度非常快(每隔5分钟就会添加一个新行)。现在在我的网站上,我发布了一天的最小/最大数据,以及我的整个存在(大约1年)。
现在我想知道,如果我将从创建附加表中受益,这些最小/最大数据将被存储,而不是让php执行mysql查询来搜索日最小/最大数据和最小/最大数据对于我的气象站的整个存在。查询max(),min()或sum()(需要sum()来累计几个月的雨累积)会花费更长的时间然后对表进行简单查询,该表已经保存了那些min,max和sum值?
答案 0 :(得分:3)
是的,在这种情况下,非规范化应该有助于提高性能。
存储计算历史数据没有任何问题,这些数据不会改变以获得性能优势。
答案 1 :(得分:3)
这取决于你的列被编入索引的天气。如果是MIN()和MAX(),您可以在MySQL手册中阅读以下内容:
MySQL使用这些索引 运营:
查找a的MIN()或MAX()值 特定索引列key_col。这个 由预处理器优化 检查您是否使用WHERE key_part_N =所有关键部件的常量 发生在key_col之前的 指数。在这种情况下,MySQL会做一个 每个MIN()或的单键查找 MAX()表达式并替换为 一个常数。
换句话说,如果您的列被编入索引,则不太可能通过非规范化获得很多性能优势。如果他们不是你肯定会获得表现。
对于SUM(),它在索引列上可能会更快,但我对此处的性能提升并不十分自信。
请注意,阅读此帖后,您不应该想要对列进行索引。如果您放置索引,您的更新查询将会变慢!
Cheerz!
答案 2 :(得分:1)
虽然我同意RedFilter认为存储历史数据没有任何问题,但我不同意你将获得的性能提升。您的数据库不是我认为的大量使用数据库。
数据库的一个主要优点是索引。他们使用先进的数据结构快速实现数据访问。试想一下,你拥有的每个主键都是一个索引。你不应该害怕他们。当然,制作所有字段索引可能会产生相反的效果,但这绝不应该是必要的。我建议更多地研究索引以找到合适的平衡点。
至于改变发生时所做的工作,并没有那么糟糕。索引是表示字段数据的树状结构。这样做是为了将搜索减少到少量的近二元决策。
例如,考虑找一个介于1和100之间的数字。通常你会随机刺入数字,或者你只是从1开始计算。这很慢。相反,如果你设置它会更快,这样当你选择一个数字时,你可以询问你是否超过或低于。那么你将从50开始,询问你是否已经过了或者不足。在,然后选择75,依此类推,直到找到数字。而不是可能通过100个数字,你只需要通过大约6个数字来找到正确的数字。
这里的问题是当您添加50个数字并使其超出1到150时。如果您再次从50开始,则搜索不太优化,因为您上面有100个数字。您的二进制搜索不平衡。所以,你所做的是再次从中间点开始重新平衡你的搜索,即75。
因此,数据库的工作只是调整以重新平衡其索引的中点。实际上并不是很多工作。如果您正在处理大型数据库并且需要进行多次更改,那么您肯定需要为索引提供强大的策略。在一个像你这样的变化很少的小型数据库中,这不是问题。