Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.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_Sql_Mysql_Statistics - Fatal编程技术网

PHP与MySQL统计系统

PHP与MySQL统计系统,php,sql,mysql,statistics,Php,Sql,Mysql,Statistics,例如,在一个有1.000.000行的大型数据库中,存储用户访问和统计使用IP的唯一用户的最佳数据库模型是什么 SELECT COUNT(DISTINCT ip) FROM visits 但对于1.000.000个不同的ip,这可能是一个缓慢的查询。缓存不会返回实数 大型统计系统对uniques访问的统计有多大?不要使用关系数据库。它不是用来存储这种类型的信息的 您可以尝试使用NoSQL数据库,例如(我知道很多地方都使用它进行日志记录,因为它的开销很小) 如果您必须坚持使用MySQL,您可以在i

例如,在一个有1.000.000行的大型数据库中,存储用户访问和统计使用IP的唯一用户的最佳数据库模型是什么

SELECT COUNT(DISTINCT ip) FROM visits
但对于1.000.000个不同的ip,这可能是一个缓慢的查询。缓存不会返回实数


大型统计系统对uniques访问的统计有多大?

不要使用关系数据库。它不是用来存储这种类型的信息的

您可以尝试使用NoSQL数据库,例如(我知道很多地方都使用它进行日志记录,因为它的开销很小)


如果您必须坚持使用MySQL,您可以在
ip
列中添加一个索引,这将大大加快速度…

另一个MyISAM表上只有ip列和唯一索引。您很快就会得到正确的计数(MyISAM缓存表中的行数)

[评论后添加]

如果还需要统计每个IP的访问量,请再添加一列
visitCount
,然后使用

INSERT INTO 
  visitCounter (IP,visitCount) 
VALUES 
  (INET_ATON($ip),1) 
ON DUPLICATE KEY UPDATE 
  SET visitCount = visitCount+1

这就是我的建议。另外,考虑计算唯一用户的概念。只计算一次,然后重复使用。昨天唯一访客的数量不会改变。上周唯一访问者的数量也不会改变。基于此,您可以每天/每周/每月/任何时间进行切分,并为每个新时段创建一个新表。这样,您仍然可以保留信息(如果确实需要的话),并获得处理相对较小表的性能增益。但我必须问,为什么需要保留这么多数据?为什么不每天总结一次,一两个月后再删除呢?我知道如何使用索引。。。我只要求为高填充数据库提供DB模型。我需要保存所有数据,因为我的框架需要不同服务器中所有客户机的所有信息,用于统计和其他用途。谢谢(什么更快,索引IP,或者另一个解决方案,用唯一的IP创建一个表?)好吧,这一切都取决于服务器。不要忘记,这个表的写容量将非常大(假设它是为了生存而写的)。因此,重复键更新时的
可能会影响性能,因为它需要读取索引,然后搜索到insert只需要搜索的位置(听起来有点多余,只针对一个查询。对于每秒数千次而言,这是非常重要的。此外,它允许写操作以背对背的方式进行,而不需要到处寻找。底线:测试它。制作一个测试数据库,并编写一个脚本来写入它,然后查看…@Mchl如果IP列是唯一的,该表是否总是返回COUNT=每个IP 1个?会的,但我知道William想计算所有不同IP的数量。这仍然可以通过添加
count
字段并使用
INSERT…ON DUPLICATE KEY UPDATE…
语法进行修改。对于唯一访问,这是一个很好的解决方案。绝对保存唯一IP和实际时间戳。这是存储g是一个4字节的整数,而不是最多15个字节……此外,它不需要字符集和排序例程来搜索和检索……是的。只是不要执行
WHERE INET\u NTOA(ip)='127.0.0.1'
,而是执行
WHERE ip=INET\u ATON('127.0.0.1')
。区别在于:第二个使用索引。