1. 首页
  2. >
  3. 数据库技术
  4. >
  5. MySQL

MYSQL8.023新特性,消失的列

我们来体验一下MySQL 8.0.23新特性:不可见列(invisible 关键字)。传统版本数据库中所有列都是可以查询的,现在可以指定一个不可见的列,它将对查询隐藏。如果显式引用,它可以被查到。

1、首先建表

create table test_invisible (     id   int,     name varchar(20),     money  float  invisible  )

我们假设钱这个字段涉及隐私,那么我们设置为不可见,用关键字 invisible,在表结构中我们在Extra列可以看到INVISIBLE 关键字:

MYSQL8.023新特性,消失的列

2、查询一下该表

select * from test_invisible

MYSQL8.023新特性,消失的列

可以看到我们只能看到2个列,不可见列是目前是不显示的。

3、假设我们插入一些记录来看看效果

insert into test_invisible values (1,'zhangsan',123)

报错信息:[21S01][1136] Column count doesn't match value count at row 1

如预期,插入语句中如果我们不引用它,会报错。

如果想插入必须显示的指定列名,这么插入:

insert into test_invisible(id,name,money) values (1,'zhangsan',123)

查询的时候,要注意,如果用

select * from test_invisible

是无法查询money列的,如下图

MYSQL8.023新特性,消失的列

必须指定列

select money from test_invisible

4、不可见列在什么场景上使用呢?

首先我们要知道InnoDB如何存储数据?innoDB在表空间存储数据。这些记录存储并用聚簇索引排序(主键):它们被称为索引组织表。所有的二级索引也将主键作为索引中的最右边的列(即使没有公开)。这意味着当使用二级索引检索一条记录时,将使用两个索引:二级索引指向用于最终检索该记录的主键。主键会影响随机I/O和顺序I/O之间的比率以及二级索引的大小。

简单来讲对InnoDB表来说,当没有定义主键,会使用第一个唯一非空列。如果没有可用的列,InnoDB会创建一个隐藏主键(6位)。

这类主键的问题在于您无法控制它,更糟糕的是,这个值对所有没有主键的表是全局的,如果您同时对这些表执行多次写操作,可能会产生争用问题(dict_sys->mutex)。

不可见列的用处:有了新的不可见列,如果业务上不允许添加新列,我们现在就可以向没有主键的表添加合适的主键。例如老系统的表不适合新增列,而且可能没有索引的表,

create table test (      name varchar(20),     money  float  )

现在添加指定不可见主键:

alter table test       add column id int unsigned auto_increment       primary key invisible first;

总结

在InnoDB中主键很重要,如果存量表没有主键,又不能显性新增列的话

从MySQL8.0.23开始,您可以用不可见列解决没有主键的表。