PHP Mysql跟踪访问者的可伸缩性

我有一个从一个代码库运行多个网站的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解释的user_agentsearch_term存储用于查找条目页面的任何关键字。 site_id与包含doman名称的站点设置列表的表格相关。

我怀疑问题的一部分是表格从来没有真正的休息过,所以当我们运行一个报表时,有活动查询同时插入和更新这个表。


不知道你正在运行什么类型的查询,有几件事情你可能要考虑:

  • 为每个网站创建一个单独的表格; 我知道这看起来不是一个很好的解决方案,但它不需要在表格中再添加一个昂贵的索引。
  • 设置一个只读的奴隶做你的报告查询; 这可以减轻主数据库的压力。
  • 我相信InnoDB也会为你所有的外键创建索引; 这对你的表的大小没有帮助(它也减慢了插入)。 除非定期移除页面,否则你可以不使用这些页面。
  • 如果我能想到更多,我会添加更多提示。


    250万条记录不是那么大的一张表。 我有一个记录表(记录行动,登录,注销,价格变化等),这是超过2500万条记录。

    如果你通过site_id查询并created (只是日期部分),我会建议创建类型为date的日期和索引的created_date,如下所示: INDEX (idx_lookup (site_id, created_date)这应该会给你我想的最好的索引。

    链接地址: http://www.djcxy.com/p/63471.html

    上一篇: PHP Mysql tracking visitors scalability

    下一篇: Calculate peak concurrent users on a website