我工作的网站没有在“ View ”表中存储个人页面 View :
CREATE TABLE `views` (
`view_id` bigint(16) NOT NULL auto_increment,
`user_id` int(10) NOT NULL,
`user_ip` varchar(15) NOT NULL,
`view_url` varchar(255) NOT NULL,
`view_referrer` varchar(255) NOT NULL,
`view_date` date NOT NULL,
`view_created` int(10) NOT NULL,
PRIMARY KEY (`view_id`),
KEY `view_url` (`view_url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
它非常基本,存储 user_id(用户在网站上的 ID)、他们的 IP 地址、url(没有域以稍微减少表的大小)、推荐 url(现在还没有真正使用它和可能会去掉它)、日期(当然是 YYYY-MM-DD 格式)以及 View 发生时的 unix 时间戳。
当然,该表变得相当大(目前有 400 万行,而且它是一个相当年轻的站点)并且在其上运行查询很慢。
为了进行一些基本的优化,我现在创建了一个“views_archive”表:
CREATE TABLE `views_archive` (
`archive_id` bigint(16) NOT NULL auto_increment,
`view_url` varchar(255) NOT NULL,
`view_count` smallint(5) NOT NULL,
`view_date` date NOT NULL,
PRIMARY KEY (`archive_id`),
KEY `view_url` (`view_url`),
KEY `view_date` (`view_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
这会忽略用户信息(和推荐 url)并存储每天查看 url 的次数。这可能是我们通常想要使用数据的方式(每天查看一个页面的次数)所以应该使查询非常快,但即使我主要用它来替换“ View ”表(对现在我想我可以按小时显示上周/一个月左右的页面浏览量,然后显示超过该时间的每日浏览量,因此只需要“ View ”表包含上周/一个月的数据)但它仍然很大表。
无论如何,长话短说,我想知道您是否可以给我任何关于如何最好地处理 MySQL 站点中的统计数据/页面 View 存储的提示,目标是保持表的大小) 在数据库中尽可能小,并且仍然能够轻松(并且至少相对快速)查询信息。我稍微查看了分区表,但该站点没有安装 MySQL 5.1。如果您能提供任何其他提示或想法,我们将不胜感激。
最佳答案
您可能希望为页面创建一个表,并让用户 View 引用该表。另一种可能的优化是将用户 IP 存储在不同的表中,也许是一些 session 表信息。那应该会减少您的查询时间。您在归档表方面走在正确的轨道上;同样的优化也应该对此有所帮助。
关于php - 在 MySQL 中存储 View /统计信息的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4187436/