2010-08-03 53 views
2

我有一个大型的MySQL MyISAM表,有1.5mil行和4.5GB大,每天仍然在增加。大型MySQL表 - 需要建议

我已经完成了所有必要的索引,并且性能已经大大优化。然而,通常由于查询过载,数据库偶尔会出现故障(显示500内部服务器错误)。每当出现故障时,桌子开始工作得非常缓慢,我必须做一个愚蠢但有效的任务:将整个桌子复制到一个新桌子上,并用新桌子替换新桌子!

你可能会问为什么这么愚蠢的行动。为什么不修理或优化桌子?我已经尝试过了,但是修复或优化的时间可能不仅仅是复制表的时间,更重要的是新表的执行速度要快得多。

新建表通常工作得很好。但随着时间的推移,它会变得缓慢(可能在一个月后),并最终导致再次发生故障(500台内部服务器)。这就是当所有事情都显着放缓时,我需要重复替换表的愚蠢过程。

对于您的信息: - 表中的数据很少被删除。所以表中没有太多的开销。 - 在最佳条件下,每个查询需要1-3秒。但是当它变得呆滞时,相同的查询可能需要超过30秒。 - 该表有24个字段,7个是int,3个是文本,5个是varchar,其余都是smallint。它用来保存文章。

如果你可以解释是什么原因导致呆滞,或者你有什么建议改善情况,请随时分享。我会非常感激。

+0

一个问题:该表使用任何可变长度的行吗? – zebediah49 2010-08-03 05:14:11

+0

你可以发布你的查询和“EXPLAIN”输出吗? – 2010-08-03 05:15:53

+0

对于除int,text,varchar和smallint之外的zebediah,此表不使用其他类型。文本中的长度可能会有所不同。 对于Maris,表格通过索引进行了很好的优化。每个询问都是在不需要分类的情况下完成的。我使用Explain来检查每个查询以确保每个查询都得到优化。 – Judy 2010-08-03 05:24:38

回答

2

考虑转向InnoDB。它的一个优点是它可以安全的运行。如果您需要全文功能,您可以通过实施Sphinx或Lucene等外部工具来实现这一点。

+0

我总是推荐InnoDB over ISAM,我跳过了这个建议。 – marr75 2010-08-03 12:32:20

1

分区是这里常见的策略。您可能能够按照他们提交给数据库的月份对文章进行分区(例如),然后让您的查询帐户返回感兴趣的月份的结果(如何对表进行分区取决于您和您的应用程序的设计/行为)。如果您需要结果来自多个表格,那么可以合并结果。

更好的是,根据您的MySQL版本,您的服务器可能会支持分区。详情请参阅this

+0

会有很多交叉引用,例如为每篇文章生成相关的帖子。这意味着大部分时间查询需要UNION所有分区表。鉴于此,分区将是一个不错的选择? – Judy 2010-08-03 05:31:04

+0

它会在这一代实时或批量?您能够找到相关帖子的距离有多远?数据是否经常更新? – marr75 2010-08-03 12:42:25

+0

代是实时的。没有限制多远回来。数据经常更新,实际上每批都会更新一次。 – Judy 2010-08-04 02:38:16