【问题标题】:Locking DB w/ Large Reads (Ruby-on-Rails/Heroku)使用大读取锁定数据库(Ruby-on-Rails/Heroku)
【发布时间】:2011-02-28 22:43:17
【问题描述】:
目前我有一个在 Heroku 上运行的 Web API,它不断地写入我们从其他数据源收集的信息(目前大约有半 GB 的数据,并且增长非常迅速)。我们希望在当前数据库之上添加一个报告系统,我们可以使用它从数据库中提取有用的信息。问题是,当我们运行报告时,我们锁定了数据库,并且与数据库通信的任何其他站点都超时了。有人对如何解决此类问题有任何解决方案吗? Amazon RDS 似乎在数据库复制方面有一些有趣的东西,但我不知道这是否能解决我的问题。
任何建议将不胜感激。
谢谢
【问题讨论】:
标签:
mysql
ruby-on-rails
database-design
heroku
【解决方案1】:
确保您运行的是 innodb 表,而不是旧的 isam 或 myisam 表 - innodb 具有更具可扩展性的行级锁。
确保您在所有加入/外键上都定义了索引...如果您在没有索引的情况下进行连接,它会很糟糕。还要确保您有适合您搜索或排序的数据的索引(只要它是不同的数据,而不是布尔值或少量值)
复制是另一个好主意,因为您可以以只读模式将辅助服务器上的报告作为目标,一旦解锁,它就会赶上。半 GB 的数据应该还没有真正锁定它,所以我先看看索引和 innodb。
【解决方案2】:
对此的一种解决方案是拥有数据库的副本,以便您的正常流量进入主数据库,而长时间运行的查询在从属数据库上执行。不过,我不确定您对 Heroku 上的数据库有多少控制权,它们可能不支持复制。
但是,您是否认为 Heroku 设置可能是这里的问题?除非您执行非常复杂的查询,否则 500 MB 的数据库不应该真的有性能问题。
如果您喜欢使用 MySQL 而不是 Postgres,Engine Yard 支持数据库复制(尽管通常它可能不像 Heroku 那样易于使用)。