如何让SQLite缓存select命令的结果

时间:2011-03-10 07:58:22

标签: sqlite caching query-optimization

我正在运行一个带有后端SQLite数据库的Web应用程序,该数据库仅执行读取操作。用户连接到数据库,通过select命令搜索条目,并在浏览器中查看结果。但是,select非常耗时,因为它涉及跨数百万个表行的字符模式匹配。 (结果表的大小非常小)。

不同的用户通常会进行完全相同的搜索,所以如果我可以第一次缓存选择的结果,那么下一个用户将搜索到数据库(同时或更可能在几天后)可以快速取回结果。

我如何在SQLite中执行此操作?我需要使用一个pragma吗?我听说SQLite有一个自动缓存功能,但这似乎没有帮助。请注意,我正在使用托管服务,因此无论如何我都无法重建SQLite。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

我会使用像

这样的外部缓存解决方案

memcached

APC / Zend Cache(在PHP上)

然后您可以更好地控制缓存(存储内容,生命周期,完全清除缓存......)

答案 1 :(得分:1)

用户是否使用与SQLite DB的不同连接?尝试使用PRAGMA命令增加缓存大小。

PRAGMA cache_size; 
PRAGMA cache_size = Number-of-pages;
  

查询或更改建议的最大值   数据库磁盘页面的数量   SQLite将立即保存在内存中   打开数据库文件。

来自文档:http://www.sqlite.org/pragma.html#pragma_cache_size

答案 2 :(得分:0)

在发布上述问题后,我找到了一个看似有效的简单解决方案,不需要对我使用的CPanel托管服务进行任何更改。

我没有缓存SQL结果,而是简单地缓存PHP脚本生成的整个网页。然后,为完全相同的搜索的用户提供缓存页面,完全绕过数据库。

我得到了基本的想法here

优点是涉及多个不同数据库调用的非常复杂的结果集都可以在非常小的空间中缓存。然后,使用PHP,在一段时间后删除缓存的网页是一项微不足道的任务。

我希望这有助于其他人解决类似的问题。

答案 3 :(得分:0)

我有一个非常类似的问题,我试图通过散列查询来优化,并将散列/结果存储在CACHE表中。 但有一些问题 - 例如,命令:

SELECT * FROM myTable WHERE (col1 BETWEEN 1000 AND 2000) AND (col2='StackOverflow');
SELECT * FROM myTable WHERE (col2='StackOverflow') AND (col1 BETWEEN 1000 AND 2000);

应该给出完全相同的答案,但MD5和这两个字符串会给出不同的结果。同样如下:

SELECT col1,col2 FROM myTable;
SELECT col2,col1 FROM myTable;

如果你可以标准化查询进入数据库的方式(排序SELECTables,WHERE过滤器,分组等 - 都在我们的PHP / JavaScript中),那么你可以可靠地快速散列查询,执行它们,然后存储结果在您的数据库中。如果你不打算像OP一样返回整个页面,我建议将它存储为JSON,因为这样可以节省以后转换它,并且JSON在发送给用户之前几乎总是gzip(如果你的AJAXing到用户屏幕)

要真正加快速度,您的CACHE表应该让Hash列包含UNIQUE类型,以便自动编入索引。

如果你正在使用Node.js,那么id更进一步说你可以在启动时从磁盘读取这个CACHE表,将所有哈希存储在一个set对象中,然后当你的服务器获得一个查询时,只需执行allHashes。具有(hashedSortedQuery)。由于该操作发生在内存中,因此它基本上是即时的。如果为true,则从CACHE中选择SELECT结果,其中Hash =' hashedSortedQuery',否则,(实际查询)。

最后一点 - 从我的经验做同样的事情,更新我的SQLite版本在速度方面有了很大的改进,我只提到它,因为通常在共享托管服务器上,最新版本并不总是安装。下面我今天在我的服务器上安装的全局SQLite版本和从源代码编译的最新SQLite版本之间做了比较:http://pastebin.com/hpWu3UCk