10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

8.3.12无形的索引

MySQL支持不可见索引;也就是说,优化器不使用的索引。该特性适用于主键以外的索引(显式或隐式)。

索引在默认情况下是可见的。要显式地控制新索引的可见性,请使用可见或者看不见的的索引定义的一部分创建表创建索引,或ALTER TABLE

CREATE TABLE t1 (i INT, j INT, k INT, INDEX i_idx (i) INVISIBLE) ENGINE = InnoDB;CREATE INDEX j_idx ON t1 (j) INVISIBLE;ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;

若要更改现有索引的可见性,请使用可见或者看不见的关键字的ALTER TABLE……改变指数操作:

ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;

属性中提供了关于索引是可见的还是不可见的信息INFORMATION_SCHEMA。统计数据表或显示指数输出。例如:

mysql> SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA。TABLE_SCHEMA = 'db1' AND TABLE_NAME = 't1';+------------+------------+ | INDEX_NAME | IS_VISIBLE  | +------------+------------+ | 没有i_idx |是| | j_idx | | | k_idx |不  | +------------+------------+

不可见的索引使测试删除索引对查询性能的影响成为可能,而不需要进行破坏性的更改(如果需要索引就必须撤消)。对于大型表来说,删除和重新添加索引的开销可能很大,而让它不可见和可见是快速的原位操作。

如果优化器确实需要或使用不可见的索引,有几种方法可以注意到它的缺失对查询表的影响:

  • 查询的错误会发生包含索引提示,该提示引用不可见索引。

  • 性能架构数据显示受影响查询的工作量增加。

  • 查询有所不同解释执行计划。

  • 查询出现在慢查询日志中,此前没有出现在那里。

use_invisible_indexes国旗的optimizer_switch系统变量控制优化器是否使用不可见的索引来构建查询执行计划。如果旗帜是(默认情况下),优化器会忽略不可见的索引(与引入这个标志之前的行为相同)。如果旗帜是,不可见索引仍然是不可见的,但优化器会在构建执行计划时考虑它们。

使用SET_VAR的值的优化器提示optimizer_switch暂时,您只能为单个查询的持续时间启用不可见的索引,如下所示:

mysql >解释选择/ * + SET_VAR (optimizer_switch = ' use_invisible_indexes =“)* / >我,j从t1 > = 50 \ G  *************************** 1。row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: range possible_keys: j_idx key: j_idx key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using index condition mysql> EXPLAIN SELECT i, j FROM t1 WHERE j >= 50\G *************************** 1.使用索引条件mysql>row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 5 filtered: 33.33 Extra: Using where

索引可见性不会影响索引维护。例如,对表行的更改继续更新索引,并且唯一索引可防止将重复插入列中的列,而不管索引是否可见或不可见。

没有显式主键的表仍然可以有有效的隐式主键(如果有的话)独特的上的索引非空列。在这种情况下,第一个这样的索引将相同的约束作为显式主键放在表行上,并且不能使索引不可见。考虑下表定义:

创建表T2(I INT NOT NOULL,J INT NOT NULL,唯一J_IDX(J))引擎= INNODB;

该定义不包含显式主键,但包含上的索引非空j将相同的约束作为主键放在行上,并且不能使其不可见:

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;ERROR 3522 (HY000):主键索引不可见。

现在假设一个显式的主键被添加到表中:

ALTER TABLE t2 ADD PRIMARY KEY (i);

显式主键不能变为不可见。另外,惟一索引上j不再作为隐式主键,因此可以使其不可见:

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;查询OK,受影响0行(0.03秒)