MYSQL表变大了

时间:2011-04-21 12:48:16

标签: php mysql performance scalability

我有一张表,每天大约有100,000行。我应该从这个表生成报告。我正在使用PHP生成这些报告。最近,用于执行此操作的脚本需要很长时间才能完成。如何通过转换到MYSQL之外的其他方式来提高性能,MYSQL从长远来看是可扩展的。

8 个答案:

答案 0 :(得分:8)

MySQL非常可扩展,这是肯定的。

密钥不是将数据库从Mysql更改为其他,但您应该:

  1. 优化您的查询(对其他人来说听起来很愚蠢,但我记得我前段时间做过的大改进是将SELECT *更改为仅选择列我需要。这也是我在其他代码中遇到的常见问题)
  2. 优化您的表格设计normalization等)。
  3. 您在查询中经常使用的列上的
  4. Add indexes
  5. 类似的建议here

答案 1 :(得分:2)

要使用大块数据生成报告或文件下载,您应该使用flush进行调整并增加time_limit和内存限制。

我怀疑问题在于行数,因为MySQL可以支持很多行。但是你当然可以一次获取x行并以块的形式处理它们。

我认为你的MySQL已经针对性能进行了适当的调整。

答案 2 :(得分:2)

首先分析您的查询为什么(或:是否)慢:http://dev.mysql.com/doc/refman/5.1/en/using-explain.html

答案 3 :(得分:2)

您应该阅读以下内容并了解一下设计良好的innodb表的优点以及如何最好地使用聚簇索引 - 仅适用于innodb!

该示例包含一个包含5亿行的表,查询时间为0.02秒。

MySQL and NoSQL: Help me to choose the right one

希望您感兴趣。

答案 4 :(得分:1)

另一个想法是将超过特定年龄的记录移动到历史数据库以进行存档,报告等。如果您不需要那么大的量进行事务处理,那么从事务数据存储中提取它们可能是有意义的。 / p>

将事务和报告数据库分开是很常见的。

答案 5 :(得分:1)

我要做一些假设

  • 您每天添加的100k行的时间戳是实时的,或者被相对较短的时间(最多几小时)抵消;你的100k行可以全天添加,也可以分几批添加。
  • 数据永不更新
  • 您正在使用InnoDB引擎(坦率地说,对于大型表使用MyISAM会很疯狂,因为如果发生崩溃,索引重建需要一段时间)

您还没有解释您尝试生成哪种报告,但我假设您的表格如下:

 CREATE TABLE logdata (
   dateandtime some_timestamp_type NOT NULL,
   property1 some_type_1 NOT NULL,
   property2 some_type_2 NOT NULL,
   some_quantity some_numerical_type NOT NULL,
   ... some other columns not required for reports ...
   ... some indexes ...

 );

您的报告看起来像是

SELECT count(*), SUM(some_quantity), property1 FROM logdata WHERE dateandtime BETWEEEN some_time_range GROUP BY property1;
SELECT count(*), SUM(some_quantity), property2 FROM logdata WHERE dateandtime BETWEEEN some_time_range GROUP BY property2;

现在,正如我们所看到的,这两个报告都在扫描大量的表,因为您报告了很多行。

时间范围越大报告越慢。此外,如果你有很多你不感兴趣报告的OTHER列(比如一些varchars或blob),那么它们也会减慢你的报告速度(因为服务器仍然需要检查行)。

您可以使用几种可能的技术来加快速度:

  • 为每种类型的报告添加覆盖索引,以支持您需要的列,并省略您不需要的列。这可能有很大帮助,但减慢了插入速度。
  • 根据您要报告的维度汇总数据。在这个虚构的情况下,所有报告都是计数行,或者是SUM()some_quantity。
  • 构建具有相应主键/索引/列的镜像表(包含相同数据),以使报告更快。
  • 使用列引擎(例如Infobright)

如果您的用例支持,汇总通常是一个有吸引力的选择;

您可能希望提出一个更详细的问题,并解释您的用例。

答案 6 :(得分:0)

如果您知道在脚本开头调用set_time_limit (0);可能会超出时间限制,则可以暂时关闭特定文件的时间限制。

还应该查看其他注意事项,例如将非常旧的数据建立索引或归档到不同的表。

答案 7 :(得分:-1)

最好的选择就是MongoDB或CouchDB,它们都是面向存储大量数据的非关系型数据库。假设您已经调整了MySQL安装的性能,并且您的情况不会从并行化中受益。