优化时间序列应用的MySQL数据检索

时间:2013-01-31 02:37:26

标签: mysql sql performance

我正在开发一个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年的数据,即可能超过一千行的MySQL查询时,这是如何工作的?!

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

  3. 任何协助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,您不应将每个用户放在单独的表中。您还有其他选项在您的应用程序中几乎没有侵入性。

您应该考虑对数据进行分区。根据你的说法,我会按时间(按日,周或月)划分一个分区,并为用户提供一个索引。您的查询应该看起来更像:

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

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

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