面试题答案
一键面试MySQL查询缓存机制基本工作原理
- 缓存结构:MySQL维护一个查询缓存区,这个缓存区以哈希表的形式存在。哈希表的键是查询语句本身(确切地说是经过规范化处理后的查询语句,去除空格、注释等无关内容),值则是对应的查询结果以及相关的元数据,如结果集的列信息等。
- 缓存过程:当执行一条查询语句时,MySQL首先对查询语句进行规范化处理,然后计算其哈希值。接着在查询缓存中查找是否存在对应的哈希键,如果存在且缓存未过期,就直接返回缓存中的结果,而不再执行实际的查询操作,从而大大提高查询性能。
查询结果被缓存的情况
- 查询语句要求:查询必须是完全相同的。这里的相同不仅指字符完全一致,还要求数据库、表的名称等大小写敏感部分也完全匹配。例如,
SELECT * FROM users
和SELECT * from users
(假设表名users
是区分大小写的)会被认为是不同的查询。 - 操作类型:通常,
SELECT
语句的结果有可能被缓存。但某些特定的SELECT
语句不会被缓存,比如包含不确定函数(如NOW()
、RAND()
等)的查询,因为每次执行结果可能不同;涉及临时表的查询;使用了SQL_CALC_FOUND_ROWS
等特殊语法的查询。 - 表状态:如果查询涉及的表在查询执行后到缓存命中期间没有发生数据修改(
INSERT
、UPDATE
、DELETE
等操作),则该查询结果可能被缓存。一旦表数据有修改,MySQL会自动使该表相关的所有查询缓存失效。
判断查询是否命中缓存
- 哈希查找:如上述原理中提到,MySQL通过计算查询语句的哈希值在缓存哈希表中进行查找。如果找到对应的哈希键,则初步认为可能命中缓存。
- 校验:找到哈希键后,还需要进一步校验。例如检查缓存结果对应的表数据是否发生变化(通过表的版本号等机制,当表数据修改时,版本号会更新),以及查询的数据库环境等是否与缓存时一致。只有当所有校验都通过,才确定查询命中缓存,此时直接返回缓存中的结果集。