MySQL中的不可见索引(附带实例)
不可见索引的特性对于性能调试非常有用。在 MySQL 9.0 中,索引可以被“隐藏”和“显示”。
当一个索引被隐藏时,它不会被查询优化器使用。也就是说,管理员可以隐藏一个索引,然后观察该索引对数据库的影响:如果数据库性能有所下降,说明这个索引是有用的,于是将其“恢复显示”;如果数据库性能看不出变化,说明这个索引是多余的,可以将它删除。
下面通过一个案例来了解如何隐藏和显示索引。
【实例】隐藏和显示索引。创建不可见索引,SQL 语句如下:
显示不可见索引,SQL 语句如下:
注意,当索引被隐藏时,它的内容仍然和正常索引一样实时更新。如果一个索引需要长期隐藏,那么可以将它删除,因为索引的存在会影响插入、更新和删除的性能。
再次隐藏索引,SQL 语句如下:
当一个索引被隐藏时,它不会被查询优化器使用。也就是说,管理员可以隐藏一个索引,然后观察该索引对数据库的影响:如果数据库性能有所下降,说明这个索引是有用的,于是将其“恢复显示”;如果数据库性能看不出变化,说明这个索引是多余的,可以将它删除。
下面通过一个案例来了解如何隐藏和显示索引。
【实例】隐藏和显示索引。创建不可见索引,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。