前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 8.0.23新特性 - 不可见列

MySQL 8.0.23新特性 - 不可见列

作者头像
老叶茶馆
发布于 2021-02-23 07:03:53
发布于 2021-02-23 07:03:53
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

作者:lefred 译者:孟维克 原文链接:

  • https://lefred.be/content/mysql-invisible-column-part-i/
  • https://lefred.be/content/mysql-invisible-column-part-ii/
  • https://lefred.be/content/mysql-invisible-column-part-iii/

在新的MySQL 8.0.23中,引入了新的有趣功能:不可见列

这是第一篇关于这个新功能的文章,我希望写一个3篇的系列。这是前言。

MySQL 8.0.23之前,表中所有的列都是可见的(如果您有权限的话)。现在可以指定一个不可见的列,它将对查询隐藏。如果显式引用,它可以被查到。

让我们看看它是怎样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table table1 (
   id int auto_increment primary key, 
   name varchar(20), 
   age int invisible);

在表结构中我们在Extra列可以看到INVISIBLE 关键字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
desc table1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    | INVISIBLE      |
+-------+-------------+------+-----+---------+----------------+

查看show create table语句,注意到有一个不同,当我创建表时,我希望看到INVISIBLE 关键字,但事实并非如此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show create table table1\\G
************************* 1. row *************************
        Table: table1
 Create Table: CREATE TABLE `table1` (
   id int NOT NULL AUTO_INCREMENT,
   name varchar(20) DEFAULT NULL,
   age int DEFAULT NULL /*!80023 INVISIBLE */,
   PRIMARY KEY (id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

但是我确认这个语句在创建表时会将age 列设置为不可见。所以我们有2个不同的语法来创建不可见列。

INFORMATION_SCHEMA 中也可以看到相关信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT TABLE_NAME, COLUMN_NAME, EXTRA
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'table1';
+------------+-------------+----------------+
| TABLE_NAME | COLUMN_NAME | EXTRA          |
+------------+-------------+----------------+
| table1     | id          | auto_increment |
| table1     | name        |                |
| table1     | age         | INVISIBLE      |
+------------+-------------+----------------+

插入一些数据,继续观察:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into table1 values (0,'mysql', 25), 
                          (0,'kenny', 35), 
                          (0, 'lefred','44');
 ERROR: 1136: Column count doesn't match value count at row 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into table1 (id, name, age) 
       values (0,'mysql', 25), 
              (0,'kenny', 35), 
              (0, 'lefred','44');
 Query OK, 3 rows affected (0.1573 sec

查询表中数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from table1;
+----+--------+
| id | name   |
+----+--------+
|  1 | mysql  |
|  2 | kenny  |
|  3 | lefred |
+----+--------+

再一次,如预期,我们看到不可见列没有显示。

如果我们指定它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name, age from table1;
+--------+-----+
| name   | age |
+--------+-----+
| mysql  |  25 |
| kenny  |  35 |
| lefred |  44 |
+--------+-----+

当然我们可以将列从可见转为不可见或者将不可见转为可见:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table table1 modify name varchar(20) invisible, 
                   modify age integer visible;
Query OK, 0 rows affected (0.1934 sec)

select * from table1;
+----+-----+
| id | age |
+----+-----+
|  1 |  25 |
|  2 |  35 |
|  3 |  44 |
+----+-----+

我对这个新功能感到非常高兴,在下一篇文章中我们将会看到为什么这对InnoDB来说是一个重要的功能。

本文是与MySQL不可见列相关的系列文章的第二部分。

这篇文章介绍了为什么不可见列对InnoDB存储引擎很重要。

首先,让我简单解释一下InnoDB是如何处理主键的,以及为什么一个好的主键很重要。最后,为什么主键也很重要。

InnoDB如何存储数据?

InnoDB在表空间存储数据。这些记录存储并用聚簇索引排序(主键):它们被称为索引组织表。

所有的二级索引也将主键作为索引中的最右边的列(即使没有公开)。这意味着当使用二级索引检索一条记录时,将使用两个索引:二级索引指向用于最终检索该记录的主键。

主键会影响随机I/O和顺序I/O之间的比率以及二级索引的大小。

随机主键还是顺序主键?

如上所述,数据存储在聚簇索引中的表空间中。这意味着如果您不使用顺序索引,当执行插入时,InnoDB不得不重平衡表空间的所有页。

如果我们用InnoDB Ruby来说明这个过程,下面的图片显示了当使用随机字符串作为主键插入记录时表空间是如何更新的:

每次有一个插入,几乎所有的页都会被触及。

当使用自增整型作为主键时,同样的插入:

自增主键的情况下,只有第一个页和最后一个页才会被触及。

让我们用一个高层次的例子来解释这一点:

假设一个InnoDB页可以存储4条记录(免责声明:这只是一个虚构的例子),我们使用随机主键插入了一些记录:

插入新记录,主键为AA!

修改所有页以"重新平衡"聚簇索引,在连续主键的情况下,只有最后一个页面会被修改。想象一下成千上万的插入发生时所要做的额外工作。

这意味着选择好的主键是重要的。需要注意两点:

  1. 主键必须连续。
  2. 主键必须短。

UUID怎么样?

我通常建议使用自增整型(或bigint)作为主键,但是不要忘记监控它们!

但我也明白越来越多的开发人员喜欢使用uuid。

如果您打算使用UUID,您应该阅读MySQL8.0中UUID的支持,这篇文章推荐您用binary(16) 存储UUID。

如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t (id binary(16) PRIMARY KEY);
 
INSERT INTO t VALUES(UUID_TO_BIN(UUID()));

然而,我并不完全同意这个观点,为什么?

因为使用uuid_to_bin() 可能会改变MySQL的UUID实现的顺序行为(有关更多信息,请参阅额外部分)。

但是如果您需要UUID,你需要在大索引上花费一定代价,索引不要浪费存储和内存在不需要的二级索引上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from sys.schema_unused_indexes where object_schema not in ('performance_schema', 'mysql');

没有任何主键?

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

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

不可见列的用处

有了新的不可见列,如果应用不允许添加新列,我们现在就可以向没有主键的表添加合适的主键。

首先先找到这些表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT tables.table_schema , tables.table_name , tables.engine  
FROM information_schema.tables  LEFT JOIN (     
   SELECT table_schema , table_name
   FROM information_schema.statistics
   GROUP BY table_schema, table_name, index_name 
   HAVING SUM( 
     case when non_unique = 0 and nullable != 'YES' then 1 else 0 end ) = count(*) ) puks   
   ON tables.table_schema = puks.table_schema 
  AND tables.table_name = puks.table_name   
  WHERE puks.table_name IS null 
  AND tables.table_type = 'BASE TABLE' 
  AND Engine="InnoDB";
+--------------+--------------+--------+
| TABLE_SCHEMA | TABLE_NAME   | ENGINE |
+--------------+--------------+--------+
| test         | table2       | InnoDB |
+--------------+--------------+--------+

您也可以使用MySQL Shell中的校验插件:https://github.com/lefred/mysqlshell-plugins/wiki/check#getinnodbtableswithnopk

让我们查看表定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show create table table2\\G
*************** 1. row ***************
       Table: table2
Create Table: CREATE TABLE table2 (
  name varchar(20) DEFAULT NULL,
  age int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

其中的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from table2;
+--------+-----+
| name   | age |
+--------+-----+
| mysql  |  25 |
| kenny  |  35 |
| lefred |  44 |
+--------+-----+

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table table2 
     add column id int unsigned auto_increment 
     primary key invisible first;

插入一条新记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into table2 (name, age) values ('PHP', 25);

select * from table2;
+--------+-----+
| name   | age |
+--------+-----+
| mysql  |  25 |
| kenny  |  35 |
| lefred |  44 |
| PHP    |  25 |
+--------+-----+

如果我们想要查看主键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select id, table2.* from table2;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | mysql  |  25 |
|  2 | kenny  |  35 |
|  3 | lefred |  44 |
|  4 | PHP    |  25 |
+----+--------+-----+

总结

现在您知道InnoDB中为什么主键很重要,为什么一个好的主键更重要。

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

额外

仅为娱乐,并说明我对使用UUID_TO_BIN(UUID()) 作为主键的看法,让我们重新使用UUID作为不可见列重复这个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table table2 add column id binary(16) invisible first;
alter table table2 modify column id binary(16) 
      default (UUID_TO_BIN(UUID())) invisible;
update table2 set id=uuid_to_bin(uuid());
alter table table2 add primary key(id);

到目前还没什么特别的,只是创建不可见主键需要一些技巧。

查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from table2;
+--------+-----+
| name   | age |
+--------+-----+
| mysql  |  25 |
| kenny  |  35 |
| lefred |  44 |
+--------+-----+

现在,我们再向这个表插入一条新数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into table2 (name, age) values ('PHP', 25);

select * from table2;
+--------+-----+
| name   | age |
+--------+-----+
| PHP    |  25 |
| mysql  |  25 |
| kenny  |  35 |
| lefred |  44 |
+--------+-----+

Mmmm...为什么PHP现在是第一行?

因为uuid() 并不连续...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select bin_to_uuid(id), table2.* from table2;
+--------------------------------------+--------+-----+
| bin_to_uuid(id)                      | name   | age |
+--------------------------------------+--------+-----+
| 05aedcbd-5b36-11eb-94c0-c8e0eb374015 | PHP    |  25 |
| af2002e8-5b35-11eb-94c0-c8e0eb374015 | mysql  |  25 |
| af20117a-5b35-11eb-94c0-c8e0eb374015 | kenny  |  35 |
| af201296-5b35-11eb-94c0-c8e0eb374015 | lefred |  44 |
+--------------------------------------+--------+-----+

我们还有别的选择吗?

是的,如果我们参考官档,我们可以使用uuid_to_bin() 函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table table2 add column id binary(16) invisible first;
alter table table2 modify column id binary(16)        
                  default (UUID_TO_BIN(UUID(),1)) invisible;
update table2 set id=uuid_to_bin(uuid(),1);

现在我们每次插入一条新记录,插入如期望一样是顺序的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select bin_to_uuid(id,1), table2.* from table2;
+--------------------------------------+--------+-----+
| bin_to_uuid(id,1)                    | name   | age |
+--------------------------------------+--------+-----+
| 5b3711eb-023c-e634-94c0-c8e0eb374015 | mysql  |  25 |
| 5b3711eb-0439-e634-94c0-c8e0eb374015 | kenny  |  35 |
| 5b3711eb-0471-e634-94c0-c8e0eb374015 | lefred |  44 |
| f9f075f4-5b37-11eb-94c0-c8e0eb374015 | PHP    |  25 |
| 60ccffda-5b38-11eb-94c0-c8e0eb374015 | PHP8   |   1 |
| 9385cc6a-5b38-11eb-94c0-c8e0eb374015 | Python |  20 |
+--------------------------------------+--------+-----+

我们之前看了从MySQL8.0.23后,新的不可见列的功能。如果主键没有定义,我们如何使用它为InnoDB表添加主键。

如之前所述,好的主键对InnoDB很重要(存储,IOPS,二级索引,内存等)但是MySQL中主键还有一个重要的作用:复制!

异步复制

当使用"传统复制"时,如果您修改了一行记录(更新和删除),那么要在副本上修改的记录将使用索引来标识,当然如果有主键的话,还会使用主键。InnoDB自动生成的隐藏全局6字节主键永远不会被使用,因为它是全局的,所以不能保证源和副本之间是相同的。你根本不应该考虑它。

如果算法不能找到合适的索引,或者只能找到一个非唯一索引或者包含null值,则需要使用哈希表来识别表记录。该算法创建一个哈希表,其中包含更新或者删除操作的记录,并用键作为该行之前完整的映像。然后,该算法遍历目标表中的所有记录,如果找到了所选索引,则使用该索引,否则执行全表扫描(参见官档)。

因此,如果应用程序不支持使用额外的键作为主键,则使用隐藏列作为主键是加快复制的一个方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> create table t1 (name varchar(20), age int);

mysql> insert into t1 values ('mysql',25),('kenny', 35),('lefred', 44);

现在添加一个自增列作为主键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> alter table t1 add id int auto_increment primary key first;

然后按照应用程序中指定的INSERT语句添加一条记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql > insert into t1 values ('python',20);
ERROR: 1136: Column count doesn't match value count at row 1

最好的方法是修改应用的INSERT 语句,但是可能吗?

多少应用程序仍然是使用SELECT * ,并且引用列时如col[2]?

如果是这样,您有两种方法:

  1. 分析所有的查询,使用重写查询插件
  2. 使用不可见列

在这种情况下,选择是容易的(至少对像我这样的懒人说)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql > alter table t1 modify id int auto_increment invisible;
mysql > insert into t1 values ('python',20);
Query OK, 1 row affected (0.0887 sec)

很简单,不是吗?

组复制

MySQL InnoDB Cluster使用另一种复制:Group Replication。

使用组复制的要求之一是要有一个主键(这就是为什么可以使用sql_require_primary_key)。

我们使用上例中重构表,不加主键,检查该实例能否作为InnoDB Cluster:

https://lefred.be/wp-content/uploads/2021/01/Selection_9991017-1024x561.png

提示很清楚,该表上的修改不会复制到其他节点。

添加不可见主键,重新检查:

https://lefred.be/wp-content/uploads/2021/01/Selection_9991018-1024x89.png

https://lefred.be/wp-content/uploads/2021/01/Selection_9991019-1024x384.png

这意味着,如果应用程序使用的表没有主键,不允许迁移到MySQL InnoDB Cluster等高可用架构中,现在多亏了不可见列,这可以做到了。

这也解决了Hadoop Hive对MySQL InnoDB Cluster的支持(参见Hive-17306)。

原文链接

  • 不可见列-part1 (https://lefred.be/content/mysql-invisible-column-part-i/)
  • 不可见列-part2 (https://lefred.be/content/mysql-invisible-column-part-ii/)
  • 不可见列-part3 (https://lefred.be/content/mysql-invisible-column-part-iii/)
  • HIVE-17306 (https://issues.apache.org/jira/browse/HIVE-17306)

全文完。

Enjoy MySQL 8.0 :)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老叶茶馆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 8.0 之不可见列
可以看到,我们的SQL里面创建了一个表t2的字段有id、name和age,其中,age字段设置了不可见属性。
AsiaYe
2021/06/09
1.5K0
MySQL 8.0 之不可见列
MySQL入门详解(一)---mysql的语言
当客户端连接到服务器是,MySQL访问控制有两个阶段:连接验证 对用户名密码,请求验证 对权限验证
步履不停凡
2019/09/11
1.3K0
mysql各种锁,一篇文章讲明白
当数据库中有多个操作需要修改同一数据时,不可避免的会产生数据的脏读。这时就需要数据库具有良好的并发控制能力,这一切在 MySQL 中都是由服务器和存储引擎来实现的。解决并发问题最有效的方案是引入了锁的机制,锁在功能上分为共享锁 (shared lock) 和排它锁 (exclusive lock) 即通常说的读锁和写锁; 锁的粒度上分行锁和表锁,表级锁MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)
jinjunzhu
2022/09/23
2K0
mysql各种锁,一篇文章讲明白
50条MySQL常用脚本
SQL数据库开发
2024/04/25
1580
50条MySQL常用脚本
MySQL8.0之不可见索引
MySQL8.0引入了不可见索引(invisible index)和不可见列(invisible column),今天我们来说说这个特性。
AsiaYe
2021/06/09
5960
MySQL8.0之不可见索引
运维常用 mysql 语句
上周隔壁专题推送最后一篇Nginx文章(公众号出门左转 Nginx专题) ,从本周开始每周一推送MySql主题文章(Docker 主题每周四不变),文章内容均为运维方向相关,聚沙成塔,集腋成裘,第一篇文章讲一下运维工作中经常使用的 MySql 语句。
用户1560186
2019/12/19
1.5K0
MySQL 8.0 新特性 :隐藏索引 Invisible Indexes
隐藏索引有什么作用 MySQL 8.0 支持了 Invisible Indexes 隐藏索引 这个特性,可以把某个索引设置为对优化器不可见,生成查询计划时便不使用这个索引了,但这个索引还是被正常维护的,例如表数据变更后还是会更新索引。 隐藏索引 最明显的一个作用类似 索引回收站。 例如数据库长时间运行后,会积累很多索引,做数据库优化时,想清理掉没什么用的多余的索引,但可能删除某个索引后,数据库性能下降了,发现这个索引时有用的,就要重新建立。 对于较大的表来说,删除、重建索引的成本是很高的,如果在清理索引时能
dys
2018/04/04
2.6K0
第8章_索引的创建与设计原则
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
3280
第8章_索引的创建与设计原则
技术译文 | 为什么 MySQL 添加一个简单索引后表大小增长远超预期?
本文和封面来源:https://www.percona.com/,爱可生开源社区翻译。
爱可生开源社区
2024/02/21
2370
技术译文 | 为什么 MySQL 添加一个简单索引后表大小增长远超预期?
Mysql常用sql整理
加密查询 md5加密 select MD5('123456') as a 掩藏身份证号 select CONCAT(LEFT(`id_number`,9),'*********',RIGHT(`id_number`,1)) 查询身份证号 select * from test where left('id_number',6)=123456 and right('id_number',3)=456 生成随机数 select round(rand()*(999999-111111)+111111) 生
mikelLam
2022/10/31
6970
Java开发和MySQL DBA关于uuid干的架友好的解决了
这是为什么呢? 原因: 现在使用MySQL基本默认指的InnoDB引擎,InnoDB是聚集索引表,所有的数据按主键排序存储。所以对于从小到大的数据做主键插入不会引起数据页的拆分,可以实现数据高效的写入,另一方面普通索引包含主键存储,所以要求主键尽可能的短小,减少空间的浪费。 对于使用自增列(int 4byte,bigint 8byte),如果使用uuid产生的是一个无序的36byte的字符(前面是乱的),造成写入的性能会越来越差,表的数据量在1000万以内,可能性能差别还不大。
wubx
2021/07/15
1K0
Java开发和MySQL DBA关于uuid干的架友好的解决了
MySQL 8.0新特性:隐藏索引
MySQL 8.0 支持隐藏索引(invisible index),也称为不可见索引。隐藏索引不会被优化器使用。它允许快速启用/禁用MySQL Optimizer使用的索引;主键不能设置为隐藏(包括显式设置或隐式设置)。
SEian.G
2021/04/07
1.5K0
MySQL8.0新特性集锦
在8.0版本之前,默认字符集为latin1,utf8指向的是utf8mb3,8.0版本默认字符集为utf8mb4,utf8默认指向的也是utf8mb4。
MySQL技术
2019/09/08
9130
技术分享 | 可能是目前最全的 MySQL 8.0 新特性解读(上)
系统表全部换成事务型的innodb表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表。
爱可生开源社区
2023/03/23
1.5K0
MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL
那么优化自然是要针对SQL中性能较差的部分进行优化,因而这部分我们先讲解如何分析其性能差异
秋落雨微凉
2022/10/25
9930
MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL
MySQL数据导出、删除、表重命名、时间转化及级联查询
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
2.3K0
MySQL常用操作
一、查看类 查看mysql当前的各类指标status; `show status;` 查看字符集 show variables like "%character%"; show character set; 查看当前用户 select user(); 查看排序规则SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; show variables like "%collat
KaliArch
2018/06/24
3K3
MySQL常用操作
新特性解读 | MySQL 8.0 GIPK 不可见主键
作为 MySQL DBA ,相信大家都经历过在复制模式下,如果没有主键,遇到 load data ,大事务,ddl 等有大量表数据行扫描的行为时,会带来严重的主从延迟,给数据库稳定性和数据一致性带来隐患。
爱可生开源社区
2022/08/02
5400
mysql8.0新特性--隐藏索引
我们有时候想删除掉冗余索引,但是又怕删除之后影响到查询性能,这时候再回退就需要一定的时间。MySQL8.0开始支持隐藏索引(invisible indexes),隐藏索引不会被优化器使用,如果你想验证某个索引删除之后的查询性能影响,就可以暂时先隐藏该索引。但是有一点主键不能被设置为隐藏索引,当表中没有显式主键时,表中第一个唯一非空索引会成为隐式主键,也不能设置为隐藏索引。
MySQL数据库技术栈
2020/09/24
5610
Mysql 怎么产生隐藏主键 和 还要不要学MySQL
MySQL 要不要学的这个问题,回答是一定要学,继续学,哪怕不用。实际上最近有人已经问了这个问题了,还有人问ORACLE 要不要学的问题,我觉得这个些提问题的人,很奇怪,如果有觉得你有更值得要学的数据库,马上要用的数据库可以去学,没有必要问,ORACLE,MYSQL要不要学,你问我就会告诉你,学一定要学。
AustinDatabases
2024/03/21
1180
Mysql  怎么产生隐藏主键 和 还要不要学MySQL
相关推荐
MySQL 8.0 之不可见列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验