3

我有一个从一个代码库运行多个网站的 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 相同)。browseros保持从user_agent. search_term存储用于查找入口页面的任何关键字。site_id与包含具有域名名称的站点设置列表的表相关。

我怀疑部分问题是该表永远不会真正中断,因此当我们运行报告时,会同时插入和更新该表的活动查询。

4

2 回答 2

1

250 万条记录并不是一张那么大的表。我有一个超过 2500 万条记录的日志表(记录操作、登录、注销、价格变化等)。

如果您查询site_idand created(只是日期部分),我建议创建一个类型为 date 的 created_date 和一个索引,如:INDEX (idx_lookup (site_id, created_date)我相信这应该给你最好的索引。

于 2012-05-09T15:49:41.997 回答
0

在不知道您正在运行哪种查询的情况下,您可能需要考虑以下几点:

  • 为每个站点创建一个单独的表;我知道这似乎不是一个很好的解决方案,但它消除了对表中另一个昂贵索引的需要。
  • 设置一个只读从属来执行您的报告查询;这减少了主数据库的压力。
  • 我相信 InnoDB 也会为您的所有外键创建一个索引;这对表格的大小没有帮助(它也会减慢插入速度)。除非您定期删除页面,否则您可以不使用这些页面。

如果我能想到更多,我会添加更多提示。

于 2012-05-09T15:04:56.693 回答