Php 修改mysql数据库以提高效率
目前,我受雇于一家公司,通过mysql访问商店页面,为客户提供每日流量统计数据。表结构如下: 访问id、页面id、ts、ip、uri、站点id 到目前为止,有8500万行……而只有2200个帐户存在 它向客户端发送统计数据的格式为: 总访问量:XXXX 最近24小时访问:XXXXPhp 修改mysql数据库以提高效率,php,mysql,Php,Mysql,目前,我受雇于一家公司,通过mysql访问商店页面,为客户提供每日流量统计数据。表结构如下: 访问id、页面id、ts、ip、uri、站点id 到目前为止,有8500万行……而只有2200个帐户存在 它向客户端发送统计数据的格式为: 总访问量:XXXX 最近24小时访问:XXXX 在保持其当前功能的同时重构它的最佳方式是什么?我猜访问日期在一个单独的访问表中,如果将其非规范化,您将获得更好的吞吐量 预先计算您的结果将使您的统计数据查询运行得更快,下面是您将要做的一般想法 CREATE TABLE
在保持其当前功能的同时重构它的最佳方式是什么?我猜访问日期在一个单独的访问表中,如果将其非规范化,您将获得更好的吞吐量 预先计算您的结果将使您的统计数据查询运行得更快,下面是您将要做的一般想法
CREATE TABLE stats_table (
, site_identifier INT
, date_visited DATE
, visit_count INT
, INDEX(site_identifier)
);
相反,每次访问都要在该表中插入,增加访问次数。然后您可以像这样查询它:
SELECT site_identifier, visit_count FROM stats_table where date_visited = 'today';
SELECT site_identifier, SUM(visit_count) AS `total_visits` FROM stats_table GROUP BY site_identifier;
您可以组合这两个查询,但单独查询它们通常会更快。这是基于时间戳的。它在那里存储日期和时间。只要索引正确(ts和ip上的索引),该结构就相当优化。您还可以考虑预先计算一个聚合表,以便在生成报告时,您只需“从访问统计中选择*”。问题是,向客户端生成统计报告需要很长时间。我会预先计算报告所需的数据。不确定如何填充原始表,但尝试创建一个所有内容都已分组的新表,并在写入原始表的同时写入。我在最初的答案中为表结构添加了一个起点。下面是当前用于填充客户端gui的查询:`$daily_hits=$db->getValue(“从站点id={$site->id}和ts>=date_sub(now(),interval 1 day)的页面上选择count(不同的ip,日期(ts),小时(ts))$query=“从站点\u id={$site->id}所在的页面\u访问中选择计数(不同的ip、日期(ts)、小时(ts))//死亡($查询);$total_hits=$db->getValue($query);如果(!$total_hits)$hits_error=mysql_error();$stat=array();?>
过去24小时:总计:
`