Php MySql在相对较大的数据库上执行max()、min()、sum()的速度

Php MySql在相对较大的数据库上执行max()、min()、sum()的速度,php,mysql,optimization,Php,Mysql,Optimization,我有一个相对较大的气象数据数据库(130000多行),它的积累速度非常快(每5分钟就会增加一行)。现在在我的网站上,我发布了当天的最小/最大数据,以及我的气象站(大约1年)的全部数据 现在我想知道,我是否会从创建额外的表中获益,这些最小/最大数据将存储在哪里,而不是让php执行mysql查询来搜索我的整个气象站的日最小/最大数据和最小/最大数据。对max()、min()或sum()的查询(需要sum()对几个月的雨水累积进行求和)会比对一个已经保存了这些min、max和sum值的表的简单查询花费

我有一个相对较大的气象数据数据库(130000多行),它的积累速度非常快(每5分钟就会增加一行)。现在在我的网站上,我发布了当天的最小/最大数据,以及我的气象站(大约1年)的全部数据


现在我想知道,我是否会从创建额外的表中获益,这些最小/最大数据将存储在哪里,而不是让php执行mysql查询来搜索我的整个气象站的日最小/最大数据和最小/最大数据。对max()、min()或sum()的查询(需要sum()对几个月的雨水累积进行求和)会比对一个已经保存了这些min、max和sum值的表的简单查询花费更长的时间吗?

是的,在这种情况下,反规范化将大大提高性能


存储不会更改的历史数据的计算结果以获得性能优势没有什么错

这取决于您的列是否被索引。对于MIN()和MAX(),您可以在MySQL手册中阅读以下内容:

MySQL使用索引来实现这些功能 操作:

查找 特定索引列键\u列。此 是由一个预处理器优化的 检查您是否正在使用WHERE key_part_N=所有关键部件上的常数 发生在 指数在本例中,MySQL执行以下操作: 每个MIN()或 MAX()表达式,并将其替换为 常数

换句话说,在列被索引的情况下,通过非规范化不太可能获得很多性能优势。如果他们不是,你肯定会获得性能

至于SUM(),它在索引列上的速度可能更快,但我对这里的性能改进不是很有信心

请注意,你不应该在读完这篇文章后为你的专栏编索引。如果你放置索引,你的更新查询会变慢


干杯

虽然我同意RedFilter的观点,即存储历史数据没有错,但我不同意您将获得的性能提升。你的数据库并不是我所认为的一个重用的数据库。p> 数据库的主要优点之一是索引。他们使用先进的数据结构,使数据访问变得轻松快捷。试想一下,你拥有的每一个主键都是一个索引。你不应该害怕他们。当然,让所有字段都成为索引可能会适得其反,但这绝对不是必要的。我建议更多地研究指数,以找到正确的平衡

至于发生变化时所做的工作,也没那么糟糕。索引是字段数据的树状表示形式。这样做是为了将搜索减少到少量接近二进制的决策

例如,考虑寻找一个介于1和100之间的数字。通常你会随机地戳数字,或者从1开始数数。这太慢了。相反,如果你把它设置好,当你选择一个数字时,你可以问自己是在上面还是在下面,那么它会快得多。然后你会从50岁开始问自己是超过还是低于50岁。在下,然后选择75,依此类推,直到找到数字。你只需要浏览大约6个数字就可以找到正确的数字,而不是浏览100个数字

这里的问题是当你把50个数字加起来,从1到150。如果你再次从50开始,你的搜索就没有那么优化了,因为你上面有100个数字。你的二进制搜索失去平衡。因此,您要做的是重新平衡您的搜索,从中间点开始,即75


因此,数据库的工作只是重新平衡其索引中点的调整。这其实不是很多工作。如果您正在处理一个很大的数据库,并且需要在一秒钟内进行许多更改,那么您肯定需要为索引制定一个强大的策略。在一个小数据库中,像您这样的更改很少,这不是问题。

我在一个网站上读到:“当您创建一个新索引时,MySQL会构建一个单独的信息块,每次对表进行更改时都需要更新该信息块。这意味着,如果不断更新、插入和删除表中的条目,可能会对性能产生负面影响。“更新时,我们在这里讨论的是什么样的性能冲击?我的表有15列,它们没有索引。现在每5分钟插入一个新行会对性能造成多大的影响?是的,如果你有一个索引,就会有一个单独的信息块。这可能是一个B树,应该和表一起更新。如果你有许多指数,那么性能损失将是巨大的。但由于有几个索引列和每5分钟插入一行,我严重怀疑这种影响是否会明显。但也许你最好运行几个测试来确保这一点。