| title | ALTER INDEX |
|---|---|
| summary | TiDB データベースの ALTER INDEX の使用法の概要。 |
ALTER INDEX文は、インデックスの可視性をVisibleまたはInvisibleに変更するために使用されます。非表示のインデックスはDML文によって維持されますが、クエリオプティマイザでは使用されません。これは、インデックスを恒久的に削除する前に二重チェックを行いたい場合に便利です。TiDB v8.0.0以降では、システム変数tidb_opt_use_invisible_indexes変更することで、オプティマイザが非表示のインデックスを選択するように設定できます。
AlterTableStmt
::= 'ALTER' 'IGNORE'? 'TABLE' TableName AlterIndexSpec ( ',' AlterIndexSpec )*
AlterIndexSpec
::= 'ALTER' 'INDEX' Identifier ( 'VISIBLE' | 'INVISIBLE' )
ALTER TABLE ... ALTER INDEX ...ステートメントを使用してインデックスの可視性を変更できます。
CREATE TABLE t1 (c1 INT, UNIQUE(c1));
ALTER TABLE t1 ALTER INDEX c1 INVISIBLE;Query OK, 0 rows affected (0.02 sec)SHOW CREATE TABLE t1;+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int DEFAULT NULL,
UNIQUE KEY `c1` (`c1`) /*!80000 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)オプティマイザーは非表示のインデックスc1を使用できません。
EXPLAIN SELECT c1 FROM t1 ORDER BY c1;+-------------------------+----------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------+----------+-----------+---------------+--------------------------------+
| Sort_4 | 10000.00 | root | | test.t1.c1:asc |
| └─TableReader_8 | 10000.00 | root | | data:TableFullScan_7 |
| └─TableFullScan_7 | 10000.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
+-------------------------+----------+-----------+---------------+--------------------------------+
3 rows in set (0.00 sec)比較すると、 c2可視インデックスであり、オプティマイザーで使用できます。
EXPLAIN SELECT c2 FROM t1 ORDER BY c2;+------------------------+----------+-----------+------------------------+-------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+----------+-----------+------------------------+-------------------------------+
| IndexReader_13 | 10000.00 | root | | index:IndexFullScan_12 |
| └─IndexFullScan_12 | 10000.00 | cop[tikv] | table:t1, index:c2(c2) | keep order:true, stats:pseudo |
+------------------------+----------+-----------+------------------------+-------------------------------+
2 rows in set (0.00 sec)USE INDEX SQL ヒントを使用して強制的にインデックスを使用した場合でも、オプティマイザーは非表示のインデックスを使用できません。そうでない場合は、エラーが返されます。
SELECT * FROM t1 USE INDEX(c1);ERROR 1176 (42000): Key 'c1' doesn't exist in table 't1'注記:
ここでの「不可視」とは、オプティマイザに対してのみ不可視であることを意味します。不可視インデックスを変更または削除することは可能です。
ALTER TABLE t1 DROP INDEX c1;Query OK, 0 rows affected (0.02 sec)- TiDB の非表示インデックスは、MySQL 8.0 の同等の機能に基づいてモデル化されています。
- MySQL と同様に、TiDB では
PRIMARY KEYインデックスを非表示にすることはできません。