Php MySQL性能:多表还是多行?

Php MySQL性能:多表还是多行?,php,mysql,performance,Php,Mysql,Performance,我想在我的PHP/MySQL应用程序中记录对页面的访问,以实现类似于SO的视图计数。 我的计划是按每个页面上唯一的IP地址计算请求数。大约有5000个不同的页面具有查看计数。 (我知道IP数不准确,但这对我来说没关系。) 我看到了两个用于组织数据库表的选项: 一个带有“页面id”、“请求ip”字段的大表。假设每个页面平均有50个独立IP的浏览量,我会得到5000x50=250000行。当视图显示在页面上时,表格将对每个页面上的每个请求具有读写权限 另一个选项是每页有一个表,其中有一列“requ

我想在我的PHP/MySQL应用程序中记录对页面的访问,以实现类似于SO的视图计数。 我的计划是按每个页面上唯一的IP地址计算请求数。大约有5000个不同的页面具有查看计数。 (我知道IP数不准确,但这对我来说没关系。)

我看到了两个用于组织数据库表的选项:

  • 一个带有“页面id”、“请求ip”字段的大表。假设每个页面平均有50个独立IP的浏览量,我会得到5000x50=250000行。当视图显示在页面上时,表格将对每个页面上的每个请求具有读写权限
  • 另一个选项是每页有一个表,其中有一列“request\u ip”。然后我将拥有5000个表,平均存储50行。只有在查看表的页面时,才能访问该表

从总体上和性能上看,哪一个更好?还是我完全走错了方向?

5000个表意味着5000个不同的查询+5000个不同的索引集+5000个不同的数据集在服务器缓存中争夺空间。表现极有可能糟糕透顶


多个表存储完全相同的数据结构几乎总是一个糟糕的设计。如果您担心性能,可以使用MySQL将表自动拆分为多个部分,这对最终用户(例如您的查询)是透明的。

最好的方法是使用一个存储访问日期时间、页面id、,ip地址等。然后每次访问一个页面时,只需在表中添加一行即可。这将为您提供原始级别的数据,然后您可以简单地将其聚合以回答您想要的问题


以这种方式存储数据还可以让您回答更精细的问题,例如在特定的一天或一周中有多少页面浏览量?这是你在问题中提出的表格结构所无法做到的。

我不知道性能方面的最佳选择是什么,但我认为第二个选择在清洁度方面肯定非常难看。网站在繁忙时间有多忙?比如每秒10个请求或更多?目前低于每秒10个请求。但它应该在任何情况下都能很好地扩展,每天有50个独特的IP浏览量?每小时?这只是一个粗略的估计,每个页面平均会有多少总浏览量,这应该仍然可以很好地扩展。不一定,谷歌存储的海量数据如何。它们将具有相同的数据结构,但有许多表。所以这取决于手头的任务。在这种情况下,它会同意这是一个坏主意。MySql分区是你需要的东西。这是把鲸鱼比作阿米巴虫。谷歌有MapReduce、BigTables和GFS。它们与bog标准MySQL安装没有直接的可比性。同意。但是“相同的数据结构几乎总是一个糟糕的设计”在一般情况下是误导性的。@RaviBhatt,我不同意你需要看95%,而不是剩下的5%或更少。马克几乎总是这么说+1@Johan看到这些数字真是太棒了。你有消息来源吗?我以为人们在大量使用haddop,hive。mongodb等,所以一般的说法“几乎总是”是误导性的。对于那些进行大量数据处理的系统,您会怎么说?它们确实有具有相同结构的diff表。在线搜索几家分析公司。Facebook、Twitter、StackOverflow、谷歌和其他许多公司都将拥有这一功能。现在,上面的所有内容都不能只有5%。问题是,我会有很多行(在很长一段时间内,每个页面的浏览量),我必须计算每个页面请求的浏览量。根据经验,现在我知道在非常大的表(+1000000行)上进行查询是一个性能问题。因此,虽然您的解决方案非常适合跟踪主要是对表进行写访问的情况,但在我的情况下,它不是一个选项。听起来像是数据仓库数据库解决方案的工作,而不是mySql。你有没有研究过像infoBright这样的东西?