面试题答案
一键面试MySQL查询缓存基本工作原理
- 缓存存储结构:MySQL查询缓存将查询语句(SQL文本)作为键,查询结果作为值,存储在一个哈希表中。当执行一条SELECT查询时,MySQL会先计算该查询语句的哈希值,然后在哈希表中查找是否存在对应的缓存结果。
- 命中流程:如果哈希表中存在与该查询语句哈希值匹配的项,且缓存的结果没有过期,MySQL直接从缓存中取出结果返回给客户端,而无需再次执行查询语句去访问数据库。
查询缓存命中的情况
- 查询语句完全相同:包括SQL语句的字符、空格、大小写等都完全一致。例如,
SELECT * FROM users WHERE id = 1;
和select * from users where id = 1;
在MySQL查询缓存中被视为不同的查询,因为大小写不同。 - 数据库、表状态相同:相关的数据库、表没有发生结构变化(如ALTER操作),且数据没有修改(如INSERT、UPDATE、DELETE操作)。如果查询涉及的表结构或数据没有变化,且查询语句相同,缓存就可能命中。
查询缓存失效的场景
- 数据修改操作:对任何表执行INSERT、UPDATE、DELETE操作,MySQL会认为该表的数据发生了变化,所有涉及该表的查询缓存都会失效。即使只修改了表中的一行数据,所有与该表有关的查询缓存都会被清除。
- 表结构修改:当执行ALTER TABLE、CREATE TABLE、DROP TABLE等表结构变更操作时,不仅该表的查询缓存会失效,而且所有关联到该数据库的查询缓存也可能失效,因为数据库的元数据发生了改变。
- 系统变量修改:一些影响查询结果的系统变量(如
sql_mode
)发生变化时,查询缓存会失效。因为不同的系统变量设置可能导致查询结果不同。 - 使用不确定函数:如果查询中包含不确定函数,如
NOW()
、RAND()
等,每次执行查询可能得到不同结果,所以查询缓存不会命中,且这类查询结果不会被缓存。