首页 > 编程笔记 > MySQL笔记 阅读:3

MySQL中的不可见索引(附带实例)

不可见索引的特性对于性能调试非常有用。在 MySQL 9.0 中,索引可以被“隐藏”和“显示”。

当一个索引被隐藏时,它不会被查询优化器使用。也就是说,管理员可以隐藏一个索引,然后观察该索引对数据库的影响:如果数据库性能有所下降,说明这个索引是有用的,于是将其“恢复显示”;如果数据库性能看不出变化,说明这个索引是多余的,可以将它删除。

下面通过一个案例来了解如何隐藏和显示索引。

【实例】隐藏和显示索引。创建不可见索引,SQL 语句如下:
mysql> CREATE TABLE test1(a int,b int,index idx_a_b(a,b desc) invisible );
Query OK, 0 rows affected (0.18 sec)
查看索引 idx_a_b 的属性 Visible 的值,SQL 语句如下:
mysql>SHOW INDEX FROM test1 \G
*************************** 1. row ***************************
       Table: test1
   Non_unique: 1
    Key_name: idx_a_b
Seq_in_index: 2
  Column_name: b
   Collation: D
  Cardinality: 0
    Sub_part: NULL
      Packed: NULL
        Null: YES
   Index_type: BTREE
     Comment:
Index_comment:
  Visible: NO
Expression: NULL
从结果中可以看出,Visible 的属性值为 NO。

显示不可见索引,SQL 语句如下:
mysql>ALTER TABLE test1 ALTER index idx_a_b visible;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0
再次查看索引 idx_a_b 的属性 Visible 的值,SQL 语句如下:
mysql>SHOW INDEX FROM test1 \G
*************************** 1. row ***************************
        Table: test1
   Non_unique: 1
     Key_name: idx_a_b
Seq_in_index: 2
  Column_name: b
    Collation: D
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
从结果中可以看出,Visible 的属性值变为了 YES。

注意,当索引被隐藏时,它的内容仍然和正常索引一样实时更新。如果一个索引需要长期隐藏,那么可以将它删除,因为索引的存在会影响插入、更新和删除的性能。

再次隐藏索引,SQL 语句如下:
mysql>ALTER TABLE test1 ALTER index idx_a_b invisible;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0
数据表中的主键不能被设置为 invisible。

相关文章