INNODB_SYS_VIRTUAL - xiaoboluo768/mysql-system-schema GitHub Wiki

  • 该表提供查询有关InnoDB虚拟生成列和与之关联的列的元数据信息,等同于InnoDB数据字典中SYS_VIRTUAL表中的信息
  • INNODB_SYS_VIRTUAL表中展示的行信息是虚拟生成列相关联列的每个列的信息
  • 该表为memory引擎临时表,查询该表的用户需要有process权限
  • 表定义语句
CREATE TEMPORARY TABLE `INNODB_SYS_VIRTUAL` (
  `TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `POS` int(11) unsigned NOT NULL DEFAULT '0',
  `BASE_POS` int(11) unsigned NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
  • 表字段含义
  • TABLE_ID:表示与虚拟列关联的表ID,与INNODB_SYS_TABLES.TABLE_ID字段值相同
  • POS:虚拟生成列的位置顺序值。该数字较大,因为它同时编码了列序号和序号位置。且用于计算该值的公式使用了位移运算。公式为:((InnoDB实例的第n个虚拟生成列+ 1) << 16)+虚拟生成列的顺序位置值。例如:如果InnoDB实例中的第一个虚拟生成列是该表的第三列,则公式为(0 + 1)<< 16)+ 2
  • BASE_POS:虚拟生成列的关联列的顺序位置
  • 表记录内容示例
# 建表
root@localhost : (none) 01:03:42> use test
Database changed
root@localhost : test 01:13:25> CREATE TABLE `t1` (
    ->          `a` int(11) DEFAULT NULL,
    ->          `b` int(11) DEFAULT NULL,
    ->          `c` int(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
    ->          `h` varchar(10) DEFAULT NULL
    ->        );
Query OK, 0 rows affected (0.10 sec)

# 查询INNODB_SYS_VIRTUAL表
root@localhost : test 01:13:28> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_VIRTUAL
    ->        WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "test/t1");
+----------+-------+----------+
| TABLE_ID | POS   | BASE_POS |
+----------+-------+----------+
|      487 | 65538 |        0 |
|      487 | 65538 |        1 |
+----------+-------+----------+
2 rows in set (0.00 sec)

# 如果将常量值分配给虚拟生成列(如以下示例中所示),则此时该列不会在INNODB_SYS_VIRTUAL表中记录(虚拟生成列必须是一个表达式在该表中才会进行记录)
root@localhost : test 01:13:42> CREATE TABLE `t2` (
    ->          `a` int(11) DEFAULT NULL,
    ->          `b` int(11) DEFAULT NULL,
    ->          `c` int(11) GENERATED ALWAYS AS (5) VIRTUAL
    ->        );
Query OK, 0 rows affected (0.04 sec)

root@localhost : test 01:15:56> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_VIRTUAL WHERE TABLE_ID IN (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE "test/t2");
Empty set (0.00 sec)

# 虽然在innodb_sys_virtual表中未记录,但是此类列信息记录到了innodb_sys_columns表中
root@localhost : (none) 01:22:53> select c.* from information_schema.innodb_sys_tables as t join information_schema.innodb_sys_columns as c on t.table_id=c.table_id where t.name='test/t2';
+----------+------+-------+-------+--------+-----+
| TABLE_ID | NAME | POS   | MTYPE | PRTYPE | LEN |
+----------+------+-------+-------+--------+-----+
|      488 | a    |     0 |     6 |   1027 |   4 |
|      488 | b    |     1 |     6 |   1027 |   4 |
|      488 | c    | 65538 |     6 |   9219 |   4 |
+----------+------+-------+-------+--------+-----+
3 rows in set (0.00 sec)

上一篇:INNODB_FT_CONFIG表 |下一篇:INNODB_CMP和INNODB_CMP_RESET表

⚠️ **GitHub.com Fallback** ⚠️