在内存表中缓存项目ID - 好/坏?

时间:2009-11-22 21:10:57

标签: mysql caching

我在想......我有一个网站,里面有很多搜索/排序。如果我将每次搜索的结果项ID缓存到MEMORY表中,然后简单地执行WHERE item_id IN(“1”,“5”,“44”,“67”),该怎么办。

如果特定查询没有值,则执行完整查询,并将ID写入MEMORY表。

这会显着提升性能吗?或者我应该只将每个搜索结果的HTML缓存到一个html文件中并显示它?

2 个答案:

答案 0 :(得分:1)

潜在的性能提升取决于重用相同查询的频率。

将会有一个额外的步骤来扫描MEMORY表以查看该查询是否最近已运行。对于包含小数据集的唯一查询,这实际上可能会降低您的性能并不必要地增加系统的复杂性。

至于将HTML放入某种类型的输出缓存中,我建议你这样做,不管你的流量是否高到足以证明这一点,你可能会做任何查询缓存。

最重要的是,只在必要时进行优化。不必要地增加系统的复杂性不会增加价值,并且可能使维护更加困难。

答案 1 :(得分:0)

正如其他地方所说,如果您的查询被重用,那么您可以提升性能。 但是您的查询也必须返回相同的结果。如果您的数据集不是静态的,那么无论如何您都必须重做查询。

有很多选项可以提高性能。如果您已经用尽了索引的所有选项,增加了服务器上的硬件,增加了服务器和客户端之间网络的带宽,那么您可以探索其他一些选项:

  • 缓存请求的HTML:注意 这将缓存结果 搜索&使用的那种;如果是用户 改变其中一个的顺序 列,然后你需要重做 查询(*)
  • 缓存搜索的ID,但不是 订单。处理起来比较复杂, 但是如果用户有好处 更改列顺序,查询仍然一样快。您甚至可以预先缓存一些常见查询

与往常一样,系统的性能取决于很多因素。要真正回答您的问题,您需要衡量系统的性能。如果您有疑问,请测量。我发现有几次性能增益可以忽略不计。

您还必须考虑通过此类性能优化添加到系统的复杂性,以及刷新缓存,如果数据发生变化会发生什么,如何处理所有这些问题。