我试图了解表是否正在加载到 InnoDB 缓冲区。为此,我正在查询 INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 表。据我所见,桌子已满载。但是,加载到缓冲区的数据量 (MB) 与 INFORMATION_SCHEMA.TABLES 中显示的数字有很大不同。
例如:
SELECT TABLE_NAME, TABLE_ROWS
, CAST(DATA_LENGTH/POWER(1024,2) AS DECIMAL(5, 0)) AS DATA_LENGTH_MB
, CAST(DATA_FREE/POWER(1024,2) AS DECIMAL(5, 0)) AS DATA_FREE_MB
FROM INFORMATION_SCHEMA.TABLES
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '<db_name>'
AND TABLE_NAME = '<table_name>';
| TABLE_NAME | TABLE_ROWS | DATA_LENGTH_MB | DATA_FREE_MB |
|-----------------------------------------------------------|
| <table_name> | 39735968 | 10516 | 548 |
因此,根据 INFORMATION_SCHEMA.TABLES,大约有 3970 万条记录和 10.5 GB 的数据页
但是,当我运行这个时:
SELECT p.TABLE_NAME, p.INDEX_NAME
, ROUND(SUM(DATA_SIZE)/POWER(1024,2)) AS DATA_SIZE_MB
, SUM(NUMBER_RECORDS) AS NUMBER_RECORDS
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE AS p
WHERE p.TABLE_NAME LIKE '`<db_name>`.`<table_name>`' AND p.INDEX_NAME = 'PRIMARY'
AND p.PAGE_TYPE = 'INDEX' AND p.PAGE_STATE = 'FILE_PAGE'
ORDER BY p.TABLE_NAME, p.INDEX_NAME
我越来越:
| TABLE_NAME | INDEX_NAME | DATA_SIZE_MB | NUMBER_RECORDS |
-----------------------------------------------------------------------
| <db_name>.<table_name> | PRIMARY | 3505 | 45224835 |
最后,
SELECT COUNT(1) FROM <db_name>.<table_name>;
44947428
NUMBER_RECORDS 略大于 INFORMATION_SCHEMA.TABLES 中的 TABLE_ROWS。所以我假设该表已完全加载到内存中,并且 TABLE_ROWS 是近似的或不是最新的。但是为什么 INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 中的 DATA_SIZE 有很大不同(3.5 GB 与 10.5 GB)?我错过了什么?TABLES 中的数据大小是否完全不正确?
如果这很重要,数据库正在 Amazon RDS (Aurora MySQL 5.7) 上运行。
谢谢。
PS CREATE TABLE 语句(列名被混淆了,抱歉:)
CREATE TABLE `table_name` (
`recid` BINARY(32) NOT NULL,
`col1` INT(11) UNSIGNED NOT NULL,
`col2` TINYINT(1) UNSIGNED NOT NULL,
`col3` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col4` TINYINT(1) UNSIGNED NOT NULL,
`col5` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col6` TINYINT(1) UNSIGNED NOT NULL,
`col7` TINYINT(1) UNSIGNED NOT NULL,
`col8` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col9` TINYINT(1) UNSIGNED NOT NULL,
`col10` TINYINT(1) UNSIGNED NOT NULL,
`col11` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col12` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`col13` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
`col14` INT(11) UNSIGNED NULL DEFAULT NULL,
`col15` BINARY(32) NULL DEFAULT NULL,
`col16` CHAR(2) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col17` TINYINT(1) NULL DEFAULT NULL,
`col18` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`col19` TINYINT(1) NULL DEFAULT NULL,
`col20` TINYINT(1) NULL DEFAULT NULL,
PRIMARY KEY (`recid`) USING BTREE,
UNIQUE INDEX `col3` (`col3`) USING BTREE,
INDEX `col5` (`col5`) USING BTREE,
INDEX `col8` (`col8`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;