-
Notifications
You must be signed in to change notification settings - Fork 109
INNODB_SYS_VIRTUAL
xiaoboluo768 edited this page Jun 7, 2020
·
2 revisions
- 该表提供查询有关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)- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!