处理大型mysql表以获取报告

时间:2015-12-30 15:42:53

标签: php mysql

我必须从一些大型MySQL表中获得一些月度报告(现在大约有200,000,000条记录)。虽然表几乎是静态的(以前的记录没有改变,只是添加了新的记录)

  • 将这个巨大的表存储到另一个数据库(如 Oracle或...)然后运行报告查询?
  • 如果听起来合理,可能的目的地选项是什么?

本质上我想知道数据库专家在这种情况下做了什么。

1 个答案:

答案 0 :(得分:0)

提取大型表并将其加载到其他一些商业品牌和型号的RDBMS(如Oracle)中可能是浪费时间,当然也浪费了许可资金。除非您绝对需要某种特定于供应商的报告功能,否则无法在MySQL中实现。

当您提及“每月”报告时,您可能需要从这些表中检索有时间限制的数据。例如,表中可能有五年的信息,但您只需要过去六个月的信息。您可以使用适当的索引优化此类事物。

例如,您可能会有这样的查询来提取截至当月前一个月的六个月期间的销售额。

SELECT COUNT(*) num_sales, SUM(sale_value) total_sales,
       LAST_DAY(sale_date) month_ending
  FROM sales
 WHERE sale_date >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 7 MONTH
   AND sale_date < LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
   AND customer_id = 12345
 GROUP BY LAST_DAY(sale_date)

如果您的表格中有以下列的索引

customer_id, sale_date, sale_value

此查询速度相当快。构建你没有的索引需要一段时间,但这没关系,因为这是一次性交易。

如果您需要一个单独的数据库服务器进行报告,您应该探索在主从复制设置中设置MySQL。这样您的报告服务器将始终接近最新。阅读:http://dev.mysql.com/doc/refman/5.7/en/replication.html

另一件事:您可能希望对这些巨大的表而不是InnoDB使用MyISAM访问方法。听起来你通常不会更新它们。而是,您插入新行。并且,听起来您的报告工作并不一定需要最新的行。因此,InnoDB事务支持对您没有多大帮助。