我有一个从一个代码库运行多个网站的Web应用程序。我设置了一个包含应用程序上运行的站点和域的表。该应用程序跟踪访问者,以便我们可以了解每个站点和全局应用程序的流量。
我遇到的问题是访问者跟踪速度非常慢,因为那里有250万条记录。运行查询以获取本月访问者的数量需要多分钟,这使我们的数据无法访问。
系统直接从包含所有其他文件的基本php文件记录跟踪。当它找不到现有的标识cookie时,它会在访问者表中创建一条记录。当它创建记录时,它会为用户分配一个cookie,这样当他们回来时,他们只会创建单个访问者记录。该访问者记录存储了他们浏览了多少页面以及他们进入的页面(条目页面)以及他们查看的最后一页(退出页面)。
我们获得了相当数量的流量,并且我希望通过加快结果来提供每月访问者的报告。
我曾尝试在site_id和日期之前添加索引,但它似乎没有帮助加快速度......
我们决定自己跟踪分析,而不是使用谷歌分析等工具,这样我们以后就能用它创建一些更有意义的数据。例如,当正在查看站点的用户提交联系表单并成为CRM中的联系人时,我们希望查看该联系人的历史记录以查看他们在请求支持之前查看了哪些页面等。
有什么建议吗?表格架构如下。非常感谢,我一直在试图提出解决方案时撞到墙上。
CREATE TABLE `analytics_track_visits` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT
,`site_id` int(4) unsigned default NULL
,`inc` bigint unsigned default NULL
,`referer` text NOT NULL
,`refer_host` text NOT NULL
,`user_agent` text NOT NULL
,`browser` text NOT NULL
,`os` text NOT NULL
,`search_term` text NOT NULL
,`entry_page` int(4) unsigned default NULL
,`entry_page_url` text default NULL
,`exit_page` int(4) unsigned default NULL
,`exit_page_url` text default NULL
,`created` datetime NOT NULL
,`created_ip` varchar(200) NOT NULL default ''
,`created_user_id` int(4) unsigned default NULL
,`modified` datetime NOT NULL default '0000-00-00'
,`modified_user_id` int(4) unsigned default NULL
,PRIMARY KEY(`id`)
,CONSTRAINT `analytics_track_visits__site` FOREIGN KEY (`site_id`)
REFERENCES `site` (`id`) ON DELETE CASCADE
,CONSTRAINT `analytics_track_visits__entry_page` FOREIGN KEY (`entry_page`)
REFERENCES `page` (`id`) ON DELETE CASCADE
,CONSTRAINT `analytics_track_visits__exit_page` FOREIGN KEY (`exit_page`)
REFERENCES `page` (`id`) ON DELETE CASCADE
) ENGINE=INNODB;
inc
存储该特定访问者查看的页数。 entry_page
是我们的cms页面表的外键(与exit_page相同)。 browser
和os
包含从user_agent
解释的值。 search_term
存储用于查找条目页面的任何关键字。 site_id
与包含具有doman名称的站点设置列表的表相关。
我怀疑问题的一部分是表格永远不会中断,因此当我们运行报表时,会同时插入和更新此表格的活动查询。
答案 0 :(得分:1)
250万条记录并不是一张大表。我有一个超过2500万条记录的日志表(记录操作,登录,注销,价格变化等)。
如果您按site_id
和created
查询(只是日期部分),我建议您创建一个类型为date的created_date和一个索引,如:INDEX (idx_lookup (site_id, created_date)
这应该会给你最好的我相信可能的指数。
答案 1 :(得分:0)
在不知道您正在运行什么类型的查询的情况下,您可能需要考虑以下几点:
如果我能想到更多,我会添加更多提示。