【问题标题】:How to handle SQL query result caching如何处理 SQL 查询结果缓存
【发布时间】:2010-06-22 23:26:13
【问题描述】:

在 Perl 程序中,我缓存 SQL 请求结果以加快程序运行速度。

我看到了两种常见的方法:

  • 使用查询创建哈希作为缓存结果的索引,如建议的here
  • 创建一个只有 2 个索引的哈希,第一个是使用的表的列表,第二个是 where 子句

我今天使用了第二个选项,因为当您知道它们已更改时,更容易清理给定表集的缓存。

我的问题是处理缓存清理,今天我做的大多数选择查询都是针对几乎没有变化的表。因此,当我运行更新/删除/...时,我只是清理了为该表缓存结果的哈希表部分。

这对性能影响很小,因为我很少需要清理经常使用的哈希部分。
但是现在对于一个在大多数表上更频繁地更新/删除的程序来说,这会使我的缓存效率大大降低,因为我经常需要清理它。

如何处理?我目前的缓存系统很简单,Cache::Memcached::Fast 很复杂。您是否有比我的更高效但仍然非常简单的解决方案?

【问题讨论】:

  • 对于什么数据库?我不能代表嵌入式,但主要参与者已经提供缓存 - 谷歌“硬解析与软解析”以获取更多信息。
  • Postgre、MySQL 等。它们提供缓存,但在软件中为经常调用的查询添加缓存甚至更快,并且避免数据库服务器的查询过载
  • 查询过载?数据库同时处理 1,000 多个用户。您正在为从未存在的问题创建解决方案。连接池我能理解,但不能在应用端查询缓存。
  • 我最近似乎经常这样说,但它总是让我感到惊讶,人们会多么容易地认为数据库——一种专门设计和优化以处理大量并发查询的软件——将如果被要求每秒执行多个查询,则会死机。
  • “数据库同时处理 1,000 多个用户”,将数据库放在具有 36MB 内存的 Pentium Pro 100Mhz 上,然后看看……这真的取决于。在大多数情况下,同时请求的数量比同时用户更重要。无论如何,即使使用最好的处理器和大量内存,也存在数据库过载的限制……放置 50 个前端对 1 个数据库进行大量查询,您会看到(即使处理器跟随,网络也会过载)。如果软件中的缓存可以为您节省一个昂贵的数据库服务器,每 50 个前端只需最少的软件工作量,为什么不这样做呢?为什么你认为 memcached 存在?

标签: sql perl caching


【解决方案1】:

我用于缓存不太可能更改的数据(例如配置数据)的一种方法是通过出色的 Memoize 模块使用 memoization。我将 sql 查询包装在一个函数中,在该函数中传递绑定参数和表名,并记住该函数。

use Memoize;

sub get_config_for_foo
{
     my ($table, $field1, $field2) @_;

     # generate my sql query here, using table, field1 and field2...

     return $result;

}
memoize(get_config_for_foo);

您也可以在 memcache 或类似的东西中使用缓存策略;查看Tie::Cache::LRU 以获得良好的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多