什么是最好的数据库缓存用于此应用程序?

时间:2011-11-29 20:30:50

标签: mysql database caching memcached

通过开发一个包含大约50,000行的大型数据表的Web应用程序,我大约有70%的时间。

应用程序本身是一个过滤应用程序,提供各种不同的方法来过滤此表,例如按数字进行范围过滤,最终执行正则表达式过滤的拖放过滤,实时文本搜索以及我可以继续进行。

由于这个原因,我以模块化方式编写了我的MySQL查询,以便根据发生的过滤类型动态地将实际查询本身放在一起。

目前,每次过滤操作(总计)平均需要250-350毫秒。例如: -

用户抓住可视滑块的一端,将其向内拖动,当他/她放开时,我的PHP代码动态地将范围过滤查询放在一起,结果作为JSON响应返回。从用户放开滑块到用户收到所有数据并重新绘制表格的总时间平均为250-350毫秒。

由于用户可以在很短的时间内执行大量的过滤操作,以便检索他们正在寻找的数据,因此我担心可扩展性更低。

我已经玩弄了尝试用memcached做一些花哨的缓存过期工作但是无法让它用我动态生成的查询正确地播放球。虽然一切都会正确缓存,但是当查询发生变化并保持数据相关时,我无法使缓存失效。然而,我对memcached非常缺乏经验。我的前几次尝试让我相信memcached不适合这项工作(由于查询的高度动态性。虽然这个应用程序最终可能会看到很高的并发使用率。

所以......我的问题是,是否有任何缓存机制/层可以添加到这种应用程序,以减少服务器上的命中?牢记动态查询。

或者......如果memcached是这项工作的最佳工具,并且我在早期尝试中遗漏了一块拼图,您能否提供一些有关使用memcached与此类应用程序的信息或指导?

非常感谢所有回复的人。

编辑:我应该提到数据库是MySQL。 siite本身在带有nginx代理的Apache上运行。但是这个问题纯粹与加速和减少数据库命中有关,其中有很多。

我还应该补充一点,引用的250-350ms往返时间是完全遥远的。如从访问网站的远程计算机。时间包括DNS查找,数据检索等。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你实际上是在寻求一种方法来减少针对数据库的查询次数,尽管几乎没有完全相同的查询。

你基本上有三个选择:

  1. 对数据库进行大量查询,使用适当的索引优化数据库并尽可能地规范化数据。确保在查询构建中避免正常的性能缺陷(例如ON子句或WHERE子句中的大量OR)。提供mashup查询的视图等。
  2. 以memcached或类似方式缓存通用查询,即没有部分或全部过滤器。并在应用程序层中应用过滤器。
  3. 实施搜索索引服务器,如SOLR。
  4. 我建议你先做第一件事。即使对于复杂的查询,250-300毫秒的往返时间听起来也有点高,听起来你只需改进现阶段已有的东西就可以获得很多好处。 对于更高的工作负载,我建议使用解决方案3,它将帮助您实现您在处理大量不同查询时成为冠军的目标。

答案 1 :(得分:0)

使用Memcache并将密钥设置为过滤查询或基于过滤器的某个唯一密钥。理想情况下,您可以编写应用程序,以便在添加新数据时使密钥到期。

答案 2 :(得分:0)

  1. 当您偶尔运行相同的查询时,您只能充分利用缓存。
  2. 使用memcache缓存的一个好方法是定义一个与调用它的函数匹配的键。例如,如果名为UserModel的模型具有方法getUser($userID),则可以将所有用户缓存为USER_id。对于更高级的函数(Model2::largerFunction($arg1, $arg2)),您只需使用MODEL2_arg1_arg2 - 这样可以轻松避免名称空间冲突。
  3. 对于全文搜索,请使用搜索索引器,例如Sphinx或Apache Lucene。它们可以改善您的查询(我能够在不到500毫秒的时间内在1.6 GHz原子处理器上的1000万个记录表上进行全文搜索)。