【问题标题】:Optimizing MySQL Data Retrieval for Time Series Application为时间序列应用程序优化 MySQL 数据检索
【发布时间】:2013-01-31 10:44:47
【问题描述】:

我正在开发一个 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),例如一个小时或更长时间,以减少服务器(因为这是分析数据,它确实应该是实时的,但我担心即使没有更改,服务器也会因查询相同的数据而过载)?!

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql sql performance


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。由于缺乏个人专业知识,我不确定我是否能够完成分区。只是关于您所说的关于汇总的最后一件事的注释,我是否应该创建另一个表,然后使用 CRON 作业例如汇总新数据库表中的数据?!这些历史汇总数据如何与当天的实时数据相结合?
    • @ChuckUgwuh 。 . .在您的示例中,您按天进行总结。但是,您仍然可以通过使用union all 将数据合并在一起来合并当前数据和历史数据。至于总结,是的,每天运行一次的 cron 作业是一个好方法。
    • 非常感谢。最后一件事,我想创建一个单独的表来捕获每个用户的分析数据,例如User1 将有一个名为user1_data 的表,User2 将有user2_data 等。您不认为将所有这些记录放在一个数据库中会更好吗?!我想当我登录用户时,他正在访问的分析数据来自他自己的表,我想这会提高性能?!请你的想法。干杯。
    • @ChuckUgwuh 。 . .如果用户的指标相同,那么您可以将它们放在一个表中。我能想到的跨表(和数据库)拆分的唯一原因是安全分离数据的应用程序要求或用户的不同备份要求。数据库引擎设计用于管理大型表,这可能比任何自定义代码都要好得多,即使您需要几个人月的开发时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多