MySQL/InnoDB 在处理外部表时是否使用表缓存?

Ric*_*ham 7 mysql cache

TL;DR:通过schema.table表缓存引用的表是否保留?

我有大量客户端数据库,我们的应用程序基于 http 请求连接到这些数据库。这些用于应用程序的每个部分,除了访问日志记录。我们使用第二个中央模式来记录跨应用程序所有实例的登录尝试。

但是,登录表是通过与本地模式的连接作为外部表访问的。例如:

 UPDATE central_schema.login SET column = 'value';
Run Code Online (Sandbox Code Playgroud)

而不是直接使用第二个连接到中央模式并仅login作为本地表处理:

UPDATE login SET column = 'value';
Run Code Online (Sandbox Code Playgroud)

或者切换模式:

USE central_schema;
UPDATE login SET column = 'value';
USE client_schema;
Run Code Online (Sandbox Code Playgroud)

鉴于在繁忙时期,我看到很多简单的更新或选择查询等待表关闭,当引用跨模式时,MySQL 是否可能不缓存表?是否有可能因为它连接到client_schema,它想要使用客户端架构缓存,因此无法正确缓存外部表?

而且,如果我不能得到一个明确的答案,我将如何开始测试缓存中的内容和不包含的内容?

Ric*_*mes 0

让我们看看您是否有以下问题table_open_cache

SHOW VARIABLES LIKE 'table%cache';
SHOW GLOBAL STATUS LIKE '%open%';
SHOW GLOBAL STATUS LIKE 'Up%';
Run Code Online (Sandbox Code Playgroud)

您的系统中有多少张表(不仅仅是一个数据库)?

FOREIGN_KEYs需要访问“其他”表的索引。这通常是FK 的成本损失。然而,所有此类访问都缓存在 innodb_buffer_pool 中,因此通常不是磁盘命中。