Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修改mysql数据库以提高效率_Php_Mysql - Fatal编程技术网

Php 修改mysql数据库以提高效率

Php 修改mysql数据库以提高效率,php,mysql,Php,Mysql,目前,我受雇于一家公司,通过mysql访问商店页面,为客户提供每日流量统计数据。表结构如下: 访问id、页面id、ts、ip、uri、站点id 到目前为止,有8500万行……而只有2200个帐户存在 它向客户端发送统计数据的格式为: 总访问量:XXXX 最近24小时访问:XXXX 在保持其当前功能的同时重构它的最佳方式是什么?我猜访问日期在一个单独的访问表中,如果将其非规范化,您将获得更好的吞吐量 预先计算您的结果将使您的统计数据查询运行得更快,下面是您将要做的一般想法 CREATE TABLE

目前,我受雇于一家公司,通过mysql访问商店页面,为客户提供每日流量统计数据。表结构如下:

访问id、页面id、ts、ip、uri、站点id

到目前为止,有8500万行……而只有2200个帐户存在

它向客户端发送统计数据的格式为:

总访问量:XXXX 最近24小时访问:XXXX


在保持其当前功能的同时重构它的最佳方式是什么?

我猜访问日期在一个单独的访问表中,如果将其非规范化,您将获得更好的吞吐量

预先计算您的结果将使您的统计数据查询运行得更快,下面是您将要做的一般想法

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小时:总计:

`