我们有一个数据仓库,其中包含从500K到6+百万行的非规范化表。我正在开发一个报告解决方案,因此出于性能原因,我们使用数据库分页。我们的报告有搜索标准,并且我们已经创建了必要的索引,但是,在处理百万行表时,性能很差。客户端设置为总是知道记录总数,因此我必须获取数据以及记录计数。
我还能做些什么来提高性能呢?我不是MySQL数据库管理员,他也没有提供任何东西,所以我不确定他能在配置方面做些什么。
谢谢!
发布于 2011-04-21 01:02:02
如果对大表进行分区,并将各部分存储在不同的服务器上,则查询的运行速度会更快。
请参阅:http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
还要注意,使用NDB表,您可以使用在O(1)时间内查找到的散列键。
对于行数,您可以在一个单独的表中保存一个运行总数,并更新该表。例如在after insert
和after delete
触发器中。
尽管触发器会减慢删除/插入的速度,但这将随着时间的推移而传播。请注意,您不必将所有总计保存在一行中,您可以按条件存储总计。类似于:
table field condition row_count
----------------------------------------
table1 field1 cond_x 10
table1 field1 cond_y 20
select sum(row_count) as count_cond_xy
from totals where field = field1 and `table` = table1
and condition like 'cond_%';
//just a silly example you can come up with more efficient code, but I hope
//you get the gist of it.
如果你发现自己总是计算相同的条件,这可以加快你重新设计的select count(x) from bigtable where ...
从几分钟到立即。
发布于 2011-04-21 01:03:24
你应该使用“分区”。
它的主要目标是减少特定SQL操作读取的数据量,从而缩短总体响应时间。
请参阅:
http://dev.mysql.com/tech-resources/articles/performance-partitioning.html
https://stackoverflow.com/questions/5733892
复制相似问题