【问题标题】:web.py mysql query cacheweb.py mysql查询缓存
【发布时间】:2015-02-05 19:08:15
【问题描述】:

我有一个大约需要 20 秒的 sql 选择查询,我想使用 mysql 缓存来缓存结果,以便快速获取结果。

在 my.cnf 中进行一些配置后,我在 Linux mysql 客户端控制台中运行选择查询时成功实现了这一点。

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);

【问题讨论】:

  • 你做了什么使结果缓存在 mysql 客户端控制台中?
  • 我在 my.cnf 中添加以下行: query_cache_size = 268435456 query_cache_type = 1 query_cache_limit = 1048576

标签: python mysql caching


【解决方案1】:

您在更改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.如果缓存是开启的,但不知何故你无法获得缓存结果,你可能需要了解 MySQL 的缓存是如何工作的:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html

注意:您可能希望使用 web.py 环境和 mysql 控制台运行这些 SQL。如果您看到不同的结果,则某些缓存的相关设置可能会有所不同。为什么?由于这些 SQL 是在不同的会话中执行的,因此 MySQL 可以在会话级别设置一些配置。

【讨论】:

  • 感谢您的回答。我已经重新启动了mysql服务器。但是缓存查询仅在我在 Linux mysql 客户端控制台中运行查询时才有效。就像你说的,web.py sql 查询可能在不同的会话中执行,并且可能存在一些配置差异。所以我想我的 web.py 代码中可能缺少一些代码,但我没有错过什么
  • 如果您运行这些用于检查缓存状态的 SQL,并且它确实报告缓存已关闭,您可能需要尝试运行另一个 SQL set session query_cache_type = ON 以查看它是否有帮助。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多