为啥 INNODB_SYS_TABLES.N_COLS 为每个表显示 3+ 列?

Posted

技术标签:

【中文标题】为啥 INNODB_SYS_TABLES.N_COLS 为每个表显示 3+ 列?【英文标题】:Why does INNODB_SYS_TABLES.N_COLS show 3+columns for every table?为什么 INNODB_SYS_TABLES.N_COLS 为每个表显示 3+ 列? 【发布时间】:2012-07-06 13:38:42 【问题描述】:

我刚刚安装了 mysql 5.6 开发版本,以检查 performance_schema 和 information_schema 的一些改进。而且,我发现了这个——

在 sakila.actor 表中有 4 列。从 information_schema.INNODB_SYS_TABLES 列中检查 - N_COLS 显示演员为 7 而不是 4。我可以看到对于每个表 N_COLS 显示 3+ 列。

sakila.actor-

CREATE TABLE `actor` (
  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(256) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`),
  KEY `last_name` (`last_name`,`actor_id`)
) ENGINE=InnoDB

information_schema.INNODB_SYS_TABLES中选择*;

TABLE_ID  NAME                        FLAG  N_COLS   SPACE  
--------  ------------------------  ------  ------  --------
      11  SYS_FOREIGN                    0       7         0
      12  SYS_FOREIGN_COLS               0       7         0
      38  sakila/actor                   1       7         0
      39  sakila/actor_info              1       7         0

从docs 开始,它显示 N_COLS= 表中的列数。

那么为什么每个表都显示 3+ 列?有什么想法吗?

【问题讨论】:

【参考方案1】:

我在网上找到的,这是因为 InnoDB 添加了三个隐藏列(DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR)

可以看源码here

【讨论】:

太棒了! MySQL 文档应该明确记录这一点。无论如何,谢谢:-)

以上是关于为啥 INNODB_SYS_TABLES.N_COLS 为每个表显示 3+ 列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?