MySQL8.0特性之不可见索引讲析
admin
2023-04-27 02:40:18
0次

本文主要给大家介绍MySQL8.0特性之不可见索引讲析,希望可以给大家补充和更新些知识,如有其它问题需要了解的可以持续在行业资讯里面关注我的更新文章的。

MySQL8.0新特性——不可见索引(Invisible Indexes)

MySQL8.0开始支持看不见的索引。一个看不见的索引根本不被优化器使用,但是通常是保持正常的。默认情况下索引是可见的。不可见的索引使测试在查询性能上删除索引的效果成为可能,而不需要在需要索引的情况下进行破坏性的更改。

注意:

 该特性适用于除主键以外的索引(显式或隐式)默认情况下索引是可见的!。

 将index设置为invisible,会导致优化器在选择执行计划时,自动忽略该索引,即便使用了FORCE INDEX

1、创建测试表t1,并创建3个不可见索引

mysql> CREATE TABLE t1 (i INT,j INT,k INT, INDEX i_idx (i) INVISIBLE) ENGINE = InnoDB;
mysql> CREATE INDEX j_idx ON t1 (j) INVISIBLE;   --创建不可见索引:j_idx
mysql> ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;  --创建不可见索引:k_idx
mysql> SELECT INDEX_NAME, IS_VISIBLE   FROM INFORMATION_SCHEMA.STATISTICS   WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';   --可以看到3个索引都是不可见状态
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| i_idx      | NO         |
| j_idx      | NO         |
| k_idx      | NO         |
+------------+------------+
3 rows in set (0.00 sec)


2、修改索引为可见状态,也就是可使用的状态

mysql> ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;   --修改索引为可见状态
mysql> SELECT INDEX_NAME, IS_VISIBLE   FROM INFORMATION_SCHEMA.STATISTICS   WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';  --可以看到状态为yes了。
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| i_idx      | YES        |
| j_idx      | NO         |
| k_idx      | NO         |
+------------+------------+
3 rows in set (0.00 sec)

注意:

主键索引是不能被设为不可见索引的!!!!!


一个没有显式主键的表可能仍然有一个有效的隐式主键,如果它在非空列上有任何惟一的索引。在这种情况下,第一个这样的索引将同样的约束放在表中行上,作为一个显式的主键,而该索引不能被忽略。如下:


3、创建测试表:t2,并设置唯一索引:j_idx(这个表没有明确主键,但是在NOT NULL列j上的索引在行上放置了相同的约束,可以作为主键)

mysql> CREATE TABLE t2 (i INT NOT NULL,j INT NOT NULL,UNIQUE j_idx (j)) ENGINE = InnoDB;  
Query OK, 0 rows affected (0.12 sec)
mysql> SELECT INDEX_NAME, IS_VISIBLE   FROM INFORMATION_SCHEMA.STATISTICS   WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't2';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx      | YES        |
+------------+------------+
1 row in set (0.00 sec)

3.1、将索引设置为不可见索引:会发现报错

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;

ERROR 3522 (HY000): A primary key index cannot be invisible

  (报错是因为:虽然这个表没有明确的主键,但是在NOT NULL列j上的索引在行上放置了相同的约束,作为主键,不能被忽略:)


3.2、增加一个主键,如下:

mysql> ALTER TABLE t2 ADD PRIMARY KEY (i);   --增加一个主键
mysql> SELECT INDEX_NAME, IS_VISIBLE   FROM INFORMATION_SCHEMA.STATISTICS   WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't2';   --可以查看到有一个主键索引
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx      | YES        |
| PRIMARY    | YES        |
+------------+------------+
2 rows in set (0.00 sec)


3.3、这时候,将j_idx索引设置为不可见状态是可以的,如:

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;
mysql> SELECT INDEX_NAME, IS_VISIBLE   FROM INFORMATION_SCHEMA.STATISTICS   WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't2';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx      | NO         |
| PRIMARY    | YES        |
+------------+------------+
2 rows in set (0.00 sec)

从上面可以看出,已经存了显示的主机,而j_idx唯一索引不再充当隐式主键,因此可以将其设置为不可见状态。


4、日常操作:


--创建表指定索引为不可见状态:

create table t1(id int primary key,name varchar(10),index idx_name (name) invisible);



--修改索引为可见状态:

alter table t1 alter index idx_name visible;



--修改索引为不可见状态:

alter table t1 alter index idx_name invisible;


--查看数据库中有哪些不可见索引:

mysql> select table_schema,table_name,index_name,column_name,is_visible from information_schema.statistics where is_visible='no';

看了以上关于MySQL8.0特性之不可见索引讲析,希望能给大家在实际运用中带来一定的帮助。本文由于篇幅有限,难免会有不足和需要补充的地方,如有需要更加专业的解答,可在官网联系我们的24小时售前售后,随时帮您解答问题的。

 



相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...