我有一个sql select查询需要大约20秒,我想使用mysql缓存来缓存结果,这样我就可以快速得到结果。
在my.cnf中进行一些配置后,我在Linux mysql客户端控制台中运行select查询时成功实现了这一点。
my.cnf中添加的行是:
query_cache_size = 268435456
query_cache_type = 1
query_cache_limit = 1048576
但是当我从web.py代码运行查询时。缓存功能似乎不起作用,也就是说,执行时间不比以前短。
以下是web.py代码:
import web
db = web.database(dbn='mysql', db='RLCM', user='guest', pw='guest')
sql = "SELECT xxx from xx"
results = db.query(sql);
我是否需要添加任何参数才能启用缓存?
我在运行查询之前通过激活SET autocommit = 1解决了这个问题。现在代码是:
import web
db = web.database(dbn='mysql', db='RLCM', user='guest', pw='guest')
sql = "SET autocommit=1;"
db.query(sql);
sql = "SELECT xxx from xx"
results = db.query(sql);
答案 0 :(得分:0)
更改my.cnf
文件后,您是否重新启动了mysql服务器?
这是一个简短的过程,可以帮助您确定问题所在:
1.确保查询缓存已开启。
sql> show variables like '%query_cache%'
have_query_cache YES
query_cache_limit 1048576
query_cache_min_res_unit 4096
query_cache_size 1048576
query_cache_type ON
query_cache_wlock_invalidate OFF
根据http://dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
您总是使用标准二进制文件获得have_query_cache YES
。但是query_cache_type
字段是一个指标。
2.检查缓存的状态
sql> show status like 'Qcache%'
enter code here
Qcache_free_blocks 1
Qcache_free_memory 1026208
Qcache_hits 1
Qcache_inserts 1
Qcache_lowmem_prunes 0
Qcache_not_cached 2
Qcache_queries_in_cache 1
Qcache_total_blocks 4
每次发送查询时,如果缓存有效,则Qcache_hits
应为+1,否则not_cached
应为+1。
3.如果缓存为ON并且无法获得缓存结果,您可能需要了解MySQL缓存的工作原理:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html
注意:您可能希望使用web.py环境和mysql控制台运行这些SQL。如果您看到不同的结果,则某些缓存的相关设置可能会有所不同。为什么?由于这些SQL在不同的会话中执行,因此MySQL可以在会话级别设置一些配置。