0

我正在使用 PHP 和 MYSQL 开发一个 URL 缩短器项目,该项目跟踪每个 url 的访问。我提供了一个主要由以下属性组成的访问表:

time_in_second | country | referrer |  os   | browser | device | url_id
#####################################################################
1348128639     |    US   |   direct |  win  | chrome  | mobile | 3404  
1348128654     |    US   |   google | linux | chrome  | desktop| 3404  
1348124567     |    UK   |   twitter| mac   | mozila  | desktop| 3404  
1348127653     |    IND  |   direct | win   | IE      | desktop| 3465  

现在我想对该表进行查询。例如,我想用 . 获取 url 的访问数据url_id=3404。因为我应该提供统计数据并绘制图表,所以对于这个 url,我需要这些数据:

  • 此 URL 的每种操作系统的数量,例如 20 个 windows,15 个 linux,...
  • 每个所需时间段内的访问次数,例如过去 24 小时内每 10 分钟的访问次数
  • 每个国家的访问次数
  • ...

如您所见,某些数据(例如国家/地区)可能会接受许多不同的值。

我可以想象的一个好主意是进行查询,该查询输出每列中每个唯一值的数量,例如在上面给出的数据的国家情况下,列上为num_US,一个为num_UK,一个为num_IND

现在的问题是如何在 sql (MYSQL) 中实现这样一个高性能的查询?

此外,如果您认为这不是对性能的有效查询,您的建议是什么?

任何帮助将不胜感激。

更新:看看这个问题:SQL;只计算每列中指定的值。我认为这个问题与我的类似,但不同之处在于每列可能有多种值(因为可能有很多值country property),这使得查询更加复杂。

4

3 回答 3

0

您要绘制的这些图表中的每一个都代表一个单独的关系,因此我的即兴响应是,您无法构建一个查询来准确地为您提供要绘制的每个图表所需的数据。

从这一点来看,您的选择是:

  1. 对不同的图表使用不同的查询
  2. 向客户端发送一堆数据,让它进行所需的后处理,以创建不同图表所需的确切数据集
  3. 把它全部交给谷歌分析(a la @wahab-mirjan)

如果您使用选项 2,您可以通过计算每(10 分钟、操作系统、浏览器、设备、url_id)元组的命中来最小化发送的数据量。这基本上删除了所有重复的行并给你一个计数。客户端软件将采用这些数字并按国家(或其他)进一步减少它们以获得图表所需的数字。不过老实说,我认为您正在为自己购买额外的复杂性而没有太多收获。

如果您坚持自己执行此操作(而不是使用服务),则对每种图形使用不同的查询。从几个合理的索引开始(url_id 和 time_in_second 是明显的起点)。使用该explain语句(或您的数据库提供的任何内容)来了解每个查询是如何执行的。

于 2012-11-04T16:13:40.720 回答
0

看起来您需要执行多个查询。您可能可以编写一个具有不同参数的查询,但这会使它变得复杂且难以维护。我会将其视为多个小查询。因此,对于每个要求,我都会进行查询并单独或单独调用它们。例如,如果您想要您提到的国家/地区查询,您可以执行以下操作

SELECT country, count (*) FROM <TABLE_NAME> WHERE url_id = 3404 GROUP BY Country

顺便说一句,我没有测试过这个查询,所以它可能不准确,但这只是给你一个想法。我希望这有帮助。

另外,另一个建议是使用谷歌分析,调查一下,他们确实有很多你已经在实施的东西,也许这也有帮助。

干杯。

于 2012-11-04T16:01:34.990 回答
0

抱歉,我是 Stack Overflow 的新手,评论格式有问题。这是我的回答,希望它现在有效:

不知道它的性能如何。我的想法是你最终会得到一个如下所示的表格:

country | count 
################# 
     US | 304 
     UK | 123 
     UK | 23 

因此,当您按国家/地区分组并计数时,这将是一个查询。我认为这会让你朝着正确的方向前进。无论如何,这只是一种意见,所以如果你找到另一种方法,我也有兴趣了解它。

对上面的评论混乱表示歉意..

干杯

于 2012-11-04T21:10:29.763 回答