The query cache does not return stale data. When tables are modified, any relevant entries in the query cache are flushed.
查询缓存不会返回过时的数据。当表被修改时,查询缓存中相关的条目会被清除。
基于 MySQL 5.7.35 版本
MySQL 官方源码下载: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.35.tar.gz
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.35.tar.gz
https://github.com/shockerli/mysql-annotated-5.7.35?tab=readme-ov-file
graph TB
A[数据修改操作<br/>INSERT/UPDATE/DELETE] --> B{是否在事务中?}
B -->|非事务表/非事务模式| C[立即失效缓存] B -->|事务表+事务模式| D[记录到changed_tables列表]
C --> E[调用invalidate_table] E --> F[加锁 Query Cache] F --> G[查找表对应的缓存块] G --> H[遍历该表关联的所有查询] H --> I[逐个删除查询缓存] I --> J[释放锁]
D --> K[事务执行中...] K --> L{事务结果?} L -->|COMMIT| M[调用invalidate_changed_tables_in_cache] L -->|ROLLBACK| N[清空changed_tables列表<br/>不失效缓存]
M --> O[遍历changed_tables列表] O --> P[对每个表调用invalidate_table] P --> E
style C fill:#ffcccc style M fill:#ffcccc style N fill:#ccffcc