2012-11-21 52 views
3

我运行一个用python编写的web应用程序,并使用mysql作为我们的主数据存储区。我们在亚马逊RDS上有一张有数千万行的大桌子,并且预计它会增大10倍。我们运行了很多查询,根据主键选择几百个随机行(如“select * from table where id IN(ids)”,其中id是主键)。偶尔很慢,需要30多秒。最后,我们必须对表格进行分片,但我们一直在考虑尝试保留缓存在memcache中的行的副本。在运行select查询之前,我们会发送一个multi_get给memcache。鉴于我们的工作流程(我们运行了很多更新),如果我们抢先将更改写入到memcache版本的行中,我们只会获得显着的性能提升。MySQL/Python抢占式缓存

我想知道是否有人使用过这样的设置,如果有ORM处理这个很好或其他有用的工具(如可能从MySQL二进制日志中提取更改并将它们发送到memcache)。这最危险的部分是如果有人忘记更新或至少使在mysql上更新的memcache中的行无效。

谢谢!

+0

您可能想对您的访问模式发表更多评论。在WHERE IN(...)'子句中使用的id是否有某种相关性(经常请求的是同一组I​​D)?你通常只引用最近添加的行吗?你正在使用任何类型的复制或集群? –

+0

不幸的是,WHERE子句中的id集合中相对较少重叠。通常,至少一半的ID基本上是均匀随机的,并且最近没有添加。复制是一种选择,但我们希望在转移到该数据库之前优化单个数据库。我们使用亚马逊RDS,因此群集不是一种选择。 – user1390511

回答

0

以下是Django中“透明”缓存的示例:https://github.com/mmalone/django-caching。 但是,我应该警告您,这种缓存可能会非常快速地变得非常复杂。

如果您拥有数千万行并且您的访问模式通常是通过行ID,那么您可能需要考虑一个NoSQL解决方案。由于您已在AWS上,因此请考虑使用DynamoDBSimpleDB。两者都提供快速和可扩展的键值访问。