暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 8.3.12不可见索引

原创 由迪 2021-05-14
412

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

默认情况下,索引可见。为了控制可视性明确了新的索引,使用一个VISIBLEINVISIBLE关键字作为指标定义的一部分CREATE TABLECREATE INDEX或者 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;
复制

要更改现有索引的可见性,请 在 操作中使用 VISIBLEINVISIBLE关键字ALTER TABLE ... ALTER INDEX

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

有关索引是可见还是不可见的信息可从 INFORMATION_SCHEMA.STATISTICS表或SHOW INDEX输出中获得。例如:

mysql> SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 't1'; +------------+------------+ | INDEX_NAME | IS_VISIBLE | +------------+------------+ | i_idx | YES | | j_idx | NO | | k_idx | NO | +------------+------------+
复制

不可见的索引可以测试删除索引对查询性能的影响,而无需进行破坏性的更改,如果需要该索引,则必须撤消该更改。对于大型表,删除和重新添加索引可能会很昂贵,而使其不可见和可见则是快速的就地操作。

如果优化程序实际上需要或使用使索引变为不可见的索引,则有几种方法可以注意到缺少索引对表查询的影响:

  • 对于包含引用不可见索引的索引提示的查询,会发生错误。
  • 性能架构数据显示了受影响查询的工作量增加。
  • 查询具有不同的 EXPLAIN执行计划。
  • 查询出现在慢查询日志中,以前没有出现在查询日志中。

系统变量 的use_invisible_indexes标志optimizer_switch控制优化器是否将不可见索引用于查询执行计划的构建。如果该标志是 off(缺省值),则优化器将忽略不可见索引(与引入此标志之前的行为相同)。如果该标志为 on,则不可见索引将保持不可见,但优化程序会在构建执行计划时将它们考虑在内。

使用SET_VAR优化程序提示optimizer_switch临时更新值 ,可以仅在单个查询期间启用不可见索引,如下所示:

mysql> EXPLAIN SELECT /*+ SET_VAR(optimizer_switch = 'use_invisible_indexes=on') */ > i, j FROM t1 WHERE j >= 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. 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
复制

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

没有显式主键的表如果UNIQUENOT NULL列上有任何索引,则仍可能具有有效的隐式主键。在这种情况下,第一个这样的索引对表行施加与显式主键相同的约束,并且该索引不能不可见。考虑以下表定义:

CREATE TABLE t2 ( i INT NOT NULL, j INT NOT NULL, UNIQUE j_idx (j) ) ENGINE = InnoDB;
复制

该定义不包含显式主键,但NOT NULL列上的索引j 对行的约束与主键相同,并且不能使其不可见:

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE; ERROR 3522 (HY000): A primary key index cannot be invisible.
复制

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

ALTER TABLE t2 ADD PRIMARY KEY (i);
复制

显式主键不能不可见。此外,上的唯一索引j不再充当隐式主键,因此可以使其不可见:

mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE; Query OK, 0 rows affected (0.03 sec)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论