使用memcached作为内存数据库?

时间:2013-11-04 14:19:53

标签: mysql memcached

我的应用程序用于查询,有m:n mysql表:

  father(id,name)
  child(id)
  join_f_c(fatherId,childId):middle table between father and child

有查询方案:

(a): select * from father f,child c,join_f_c jfc where f.name=xxx and join_f_c.fatherId=f.id and join_f_c.childId=c.id
(b): select * from father where f.id=xxx
(c): select * from father where f.name=xxx

父表有100,000行,子表有1000,000多行,grandChild表有1000,000多行。

在这款应用中,所有查询的查询性能都非常高 - 不仅是某行的第二个查询,所以我希望在app启动时将所有表数据加载到memcached中,这些是问题:

1.each(a)查询将询问memcached 3次:按名称获取父ID,然后通过来自join_f_c的fatherId获取childId,最后通过childId从子获取子,这将导致约0.5ms。 memcached是否适合此连接查询?如果我只是将查询结果放入memcached,那么会浪费很多空间 - 许多子行会有很多副本,例如:father1-child1,father2-child1。

2.for(b)和(c)查询,我需要将每个父表行两次放入memcached:一个键是id,另一个键是name,这个浪费缓存空间很多。有更好的方法这个目的?

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:4)

关于Memcached

Memcached是键/值对存储。您无法查询Memcached值的内容。您只能申请全部价值。

显然,在Memcached中存储整个表(包含100.000行)并请求PHP读取/使用表的整个值将是PHP的巨大内存和计算工作,会大大降低您的速度。

每个密钥只存储一个表记录对于PHP来说是可管理的并且会提高性能但是在PHP和PHP之间的通信方面会非常浪费。 memcached的。

一般用法

Memecached通常用于存储通常大于一个表记录的内容,例如,如果要创建基于类别/子类别的菜单,则可以将整个类别树存储在一个键中。您可能需要在每个页面上呈现该类别树,或者在每个页面上进行ajaxed,因此将其放在缓存中是可行的。

很多时候Memcached用于存储读取输出,例如整个HTML页面,或使用某些数据+模板呈现的页面(块)的HTML片段,这意味着您可以节省重建该块的计算工作量

需要考虑的事项

关键命名约定将帮助您正确检索已放入Memcached的数据。

当数据库中的数据发生变化时,你可能想要在Memcached中更新数据,或者只是从Memcached中删除它,以便下一个需要它的进程将重建它,或者保持memcached版本不变(陈旧数据),因为你的应用程序可以接受显示的旧数据(对于某个“可接受的”期间)。

命名约定对于更新或删除Memcached中的过时数据非常重要,因为数据库中的一个微小变化可能会影响存储在Memcached值中的许多内容,能够找出这些内容对于准确的缓存清除非常重要

答案 1 :(得分:1)

在我看来,您只是想将数据库复制到内存中,并且需要花费更多的空间和精力来完成它。我只是确保你在数据库服务器上有足够的内存来保存内存中的工作集(如果不是全部的话)。然后只需进行连接即可在单个请求中获取所需的所有信息。

数据库擅长他们的工作 - 使用它们,直到你遇到限制,然后通过重写你的查询来开始解决它们以避免连接和使用缓存。