我有一张表,每天大约有100,000行。我应该从这个表生成报告。我正在使用PHP生成这些报告。最近,用于执行此操作的脚本需要很长时间才能完成。如何通过转换到MYSQL之外的其他方式来提高性能,MYSQL从长远来看是可扩展的。
答案 0 :(得分:8)
MySQL非常可扩展,这是肯定的。
密钥不是将数据库从Mysql更改为其他,但您应该:
SELECT *
更改为仅选择列我需要。这也是我在其他代码中遇到的常见问题)类似的建议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)
我要做一些假设
您还没有解释您尝试生成哪种报告,但我假设您的表格如下:
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),那么它们也会减慢你的报告速度(因为服务器仍然需要检查行)。
您可以使用几种可能的技术来加快速度:
如果您的用例支持,汇总通常是一个有吸引力的选择;
您可能希望提出一个更详细的问题,并解释您的用例。
答案 6 :(得分:0)
如果您知道在脚本开头调用set_time_limit (0);
可能会超出时间限制,则可以暂时关闭特定文件的时间限制。
还应该查看其他注意事项,例如将非常旧的数据建立索引或归档到不同的表。
答案 7 :(得分:-1)
最好的选择就是MongoDB或CouchDB,它们都是面向存储大量数据的非关系型数据库。假设您已经调整了MySQL安装的性能,并且您的情况不会从并行化中受益。