使用memcached作为内存数据库?

for*_*byr 6 mysql memcached

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

  father(id,name)
  child(id)
  join_f_c(fatherId,childId):middle table between father and child
Run Code Online (Sandbox Code Playgroud)

有查询场景:

(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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

任何帮助将不胜感激

Mih*_*ncu 5

关于Memcached

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

显然,将整个表(具有100.000行)存储在Memcached中,并要求PHP读取/使用该表的整个值将是PHP的巨大内存和计算量,这会显着降低您的速度。

每个键只存储一个表记录对于PHP来说是可以管理的,并且可以提高性能,但是就PHP和Memcached之间的通信而言,这是非常浪费的。

一般用法

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

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

要考虑的事情

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

当数据库中的数据发生更改时,您可能也希望在Memcached中进行更新,或者只是从Memcached中删除它,以便需要它的下一个进程将对其进行重建,或者保持该Memcached版本不变(陈旧数据),因为您的应用程序可以接受显示较旧的数据(在某个“可接受的”时间内)。

命名约定对于更新或删除Memcached中的陈旧数据非常重要,因为数据库中的微小更改可能会影响存储在Memcached值中的许多内容,因此能够找出那些内容对于准确的缓存清除至关重要。