mysql5.7单机版查询缓存导致的诡异问题

近日研发同事反应JDBC连接池连接测试单机数据库时出现了诡异问题:

  1. 表1中数据用主键进行查询时而查得到,时而查不到;通过navicat可以查到;越过JDBC连接串,直接进行查询也可以查出来;
  2. 表2中的某一行数据用主键查询查不到,update一下该行数据就能查到了
  3. 修改了代码中sql语句,修改了*为字段或者加where 1=1就可以查到了

至此,MySQL单机缓存的原因就很明显了

查询 :show variables like ‘%query_cache%’;
(1) have_query_cache表示是否支持查询缓存,YES表示支持

(2) query_cache_type表示缓存类型,OFF表示关闭查询缓存,ON表示开启查询缓存,DEMAND表示用户自定义查询缓存

(3) query_cache_limit表示支持的最大单条查询sql数据量

(4) query_cache_min_res_unit表示查询缓存最小单位

(5) query_cache_size表示查询缓存空间大小

(6) query_cache_wlock_invalidate表示查询缓存是否支持写锁,OFF表示不支持,即读取数据不考虑写锁,ON表示支持,即读取数据会被写锁阻塞

关闭MySQL缓存:set global query_cache_type=1;

MySQL缓存机制:

(1) 只有字符串相等查询sql才使用相同缓存,即select name from city与SELECT name FROM city不使用同一个缓存。

(2) 在query_cache_type为ON的情况下,默认所有查询都使用缓存,我们可以使用sql_no_cache显示指定某个查询不使用缓存

query_cache_type=1

(3) 在query_cache_type为DEMAND的情况下,需要使用sql_cache指定某个查询使用缓存

select sql_cache name from city;

3.缓存失效:

在表的结构或数据发生改变时,查询缓存中的数据不再有效。如INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。

一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。

你可能感兴趣的:(缓存,数据库,mysql)