MySQL:复制数据以获得更高性能?

时间:2011-12-06 13:27:13

标签: mysql

我有一张大桌子(200'000'000行);像这样宣布

 thread( forum_id tinyint, thread_id int, 
         date_first datetime, date_last datetime
         replycount mediumint, extra blob )

forum_id和thread_id是主键。有了大型论坛(大约一百万个主题),我有时必须运行像SELECT thread_id FROM thread ORDER BY date_last DESC LIMIT 500000, 10这样的查询。这些具有巨大偏移量的查询需要花费一秒或几分钟来运行。

所以我认为我可以通过复制数据,为大多数线程的论坛创建一些表来加快速度。只有少数论坛超过100'000个主题,因此会有一个类似

的表格
  thread_for_forumid_123456 ( thread_id int, 
         date_first datetime, date_last datetime
         replycount mediumint )

您如何看待这个?它会加速巨大的偏移查询吗?你有其他建议吗?感谢。

3 个答案:

答案 0 :(得分:2)

首先,我将真的尽量避免你的做法。我认为这是避免性能问题的“最后机会”。

您可以购买Fusion i / o或仅购买SSD驱动器(Raid vs SSD vs FusionIO),您可以选择(从硬件到软件)。但是,您可以使用软件来解决这个问题,而根本不需要投入资金。 在您的方案中,如果您尚未使用缓存,则应使用缓存(即memcached)。 MySQL have partitioning,它不是世界上最好的选择,但是,你可以有一些良好的性能提升。

但是,如果你按照自己的想法,我建议你分享你的数据,使用一个将数据分成多个平衡的数据。 你可以做一些令人讨厌的事情:创建50个表,如thread_0到thread_49 然后(forumid%50)让你登陆这50张表中的一张。 这样你就可以避免在每次创建论坛时创建一个表,并且避免使用N个表。而索引为forum_id的select将非常快。 此外您可以在应用上使用某种逻辑来管理分页,并避免巨大的偏移

祝你好运!

PS:我在MysqlPerfomanceBlog "Why you dont want to shard"上添加了一个博客帖子

答案 1 :(得分:0)

看起来你的问题是大偏移量LIMIT 500000, 10

我不明白为什么你这里有5'000'000。如果你过滤了thread_id和forum_id,那么偏移量应该非常小,因为我不相信你在一个帖子中有500万个帖子。

SELECT thread_id FROM thread WHERE thread_id = 123456 ORDER BY date_last DESC LIMIT 10, 50

也许还要看看http://dev.mysql.com/doc/refman/5.1/en/limit-optimization.html

答案 2 :(得分:0)

MySQL Partitioning听起来像您可能会考虑的功能