【发布时间】: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 存在?