İ试图理解mysql体系结构,我向acrosa提出了两个概念。 第一个是查询缓存,据我所知,它存储了至少运行了一次的查询,并且如果查询处理器看到那里缓存了该查询,它将不再进入解析器并将结果直接带到缓存中。 / p>
但是,还有缓冲池,它是Storage Engine缓冲管理器的一部分,根据我的理解,它也做同样的事情。
所以我的问题是,如果逻辑层中有一个缓存,为什么在物理层中也需要一个缓存? ?我认为,如果在查询缓存中找到查询,则永远不会在缓冲池中搜索该查询;如果在缓存中找不到该查询,则也永远不会从缓冲池中检索该查询。我想念什么吗?
答案 0 :(得分:2)
对于查询缓存,您会发现它。它基于查询的原始文本映射到确切的查询结果。它存在严重的缩放问题,这就是MySQL-8.0 removed it的原因。
innodb缓冲池,是数据库的低级数据和索引页的存储。这样可以确保所有最近使用的数据都位于磁盘之外,并且能够在不求助于比ram慢得多的存储的情况下进行查询。
因此,缓冲池为同一数据提供所有查询,而查询缓存仅为特定查询提供服务(以可扩展性为代价)。
答案 1 :(得分:2)
为@danblack 的答案添加一些上下文,查询缓存存储查询和与查询关联的实际数据。但是在我们称为 innodb_buffer_pool 的缓冲池中存储物理 (01,10) 或低级数据或说页面。每当查询执行时,它都会检查缓冲池,如果所需的数据不存在,那么它将继续访问磁盘(即您的辅助存储)并将数据放入缓冲池。
对于查询缓存,如果不分析情况就将查询缓存大小设置得非常高,则会导致查询缓存失效。 “使查询缓存无效”是指将查询缓存中的数据或条目标记为无效,因为底层表已被 DML 语句更改。我个人经历过很多次,例如在“show processlist”下,当复制长时间停留在这个特定状态时,即无效查询缓存,一旦它使所有条目无效,事情就会开始迎头赶上。
<块引用>“为什么我们在物理层需要一个?”
这是因为查询缓存中的数据会严重影响性能IF 基础表经常更改,这会影响整体数据库性能。所以如果你的表不经常变化,查询缓存很有用。但是现在查询缓存的概念在 MySQL 8 中已经被移除了(这不是讨论的一部分)。
答案 2 :(得分:0)
Bufferpool仅用于存储来自辅助存储的页面。 CPU无法从辅助存储中获取数据,因此数据库管理系统在RAM中建立了一个池,然后CPU从RAM中保留了该缓冲池中的访问数据。
并且DBMS使用替换算法来替换此缓冲池中的页面。
数据缓存是另一回事。 还有其他用于数据缓存的数据结构和技术。