面试题答案
一键面试1. 缓存触发条件
- 完全相同查询:MySQL查询缓存只会对完全相同的查询语句进行缓存。这里的完全相同,不仅指SQL语句字符相同,还包括查询的数据库、用户权限、字符集等环境因素完全一致。例如,
SELECT * FROM users WHERE age > 18
和SELECT * FROM users WHERE age >= 18
虽然很相似,但不是完全相同,不会命中缓存。 - 非事务性表:对于使用事务性存储引擎(如InnoDB)的表,在事务未提交前,查询缓存不会生效。而对于非事务性存储引擎(如MyISAM),查询缓存可以正常工作。
2. 数据存储形式
- 哈希表存储:MySQL查询缓存使用哈希表来存储缓存数据。哈希表的键是查询语句的哈希值,值则是查询结果以及相关的元数据,如查询结果的列信息、表信息等。当接收到一个查询请求时,MySQL会先计算该查询语句的哈希值,然后在哈希表中查找是否存在对应的缓存数据。
3. 缓存失效情况
- 表数据变更:当表中的数据发生任何变化,如执行
INSERT
、UPDATE
、DELETE
操作,该表相关的所有查询缓存都会失效。这是因为数据改变后,之前的查询结果可能不再准确。例如,对users
表执行UPDATE users SET age = age + 1
后,所有涉及users
表的查询缓存都需要被清除。 - 结构变更:若表结构发生改变,如
ALTER TABLE
操作,同样会导致该表相关的查询缓存失效。比如对users
表添加一个新列email
,之前的查询缓存就不再适用。 - 服务器重启:MySQL服务器重启后,查询缓存中的所有数据都会丢失,因为缓存是基于内存的,重启会清空内存中的缓存数据。