0

我正在开发一个 Web 应用程序来显示 MYSQL 数据库表中的一些分析数据。我希望最多从大约 10,000 个总用户那里收集数据。该表将有每个用户数百万条记录。

我正在考虑为每个用户提供自己的表格,但更重要的是我想弄清楚如何优化数据检索。

SELECT COUNT我使用特定日期的一系列查询从数据库表中获取数据。下面是一个例子:

SELECT * FROM
(SELECT COUNT(id) AS data_point_1 FROM my_table WHERE customer_id = '1' AND datetime_added LIKE '2013-01-20%' AND status_id = '1') AS col_1
CROSS JOIN
(SELECT COUNT(id) AS data_point_2 FROM my_table WHERE customer_id = '1' AND datetime_added LIKE '2013-01-20%' AND status_id = '0') AS col_2
CROSS JOIN ...

当我想检索最近 30 天的数据时,查询将是上面的 30 倍;同样是 60 天,等等。用户将能够选择天数,例如 30、60、90 和自定义范围。

我需要时间序列图表的数据。需要明确的是,每天的数据可能从数千条记录到数百万条记录不等。

我的问题是:

  1. 这是检索此数据的最高效方法,还是有更好的方法在一个 SQL 查询中获取我需要的所有时间序列数据?!当用户需要过去 2 年的数据(即可能超过 1000 行的 MySQL 查询)时,这将如何工作?!

  2. 我是否应该考虑将检索到的数据(例如使用 memcache)缓存更长的时间,例如一个小时或更长时间,以减少服务器(因为这是分析数据,它确实应该是实时的,但我害怕超载即使没有更改,服务器也会查询相同的数据)?!

任何帮助将不胜感激。

4

1 回答 1

0

首先,您不应该将每个用户放在单独的表中。您还有其他选项几乎不会干扰您的应用程序。

您应该考虑对数据进行分区。根据您所说的,我将按时间(按天、按周或按月)和一个用户索引进行分区。您的查询应该看起来更像:

select date(datetime), count(*)
from t
where userid = 1 and datetime between DATE1 and DATE2
group by date(datetime)

然后,您可以在外部查询或应用程序中对此进行透视。

我还建议您每天汇总数据,以便您的分析可以在汇总表上运行。这将使事情进展得更快。

于 2013-01-31T02:44:47.287 回答