MySQL에서 SHOW INDEX, SHOW INDEXES, SHOW KEYS는 모두 동일합니다
MySQL에서 SHOW INDEX, SHOW INDEXES, SHOW KEYS 세 가지 구문은 문법적 표현만 다를 뿐 기능과 결과가 완전히 동일합니다. 세 구문 모두 테이블에 정의된 인덱스 정보를 조회하는 데 사용되며, 어떤 것을 사용해도 출력 결과에는 차이가 없습니다.
실제 예제를 통해 세 구문이 동일한 결과를 반환하는지 확인해 보겠습니다.
1. 테스트용 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1549
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20)
-> );
Query OK, 0 rows affected (0.82 sec)기본 키(PK)로 설정된 EmployeeId 컬럼은 자동으로 인덱스가 생성됩니다.
2. 인덱스 생성
다음 쿼리로 EmployeeName 컬럼에 인덱스를 추가합니다.
mysql> create index name_index1 on DemoTable1549(EmployeeName); Query OK, 0 rows affected (0.41 sec) Records: 0 Duplicates: 0 Warnings: 0
3. SHOW INDEX 실행
mysql> show index from DemoTable1549;
실행 결과:
+---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | demotable1549 | 0 | PRIMARY | 1 | EmployeeId | A | 0 | NULL | NULL | | BTREE | | | YES | | demotable1549 | 1 | name_index1 | 1 | EmployeeName | A | 0 | NULL | NULL | YES | BTREE | | | YES | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ 2 rows in set (0.17 sec)
4. SHOW INDEXES 실행
mysql> show indexes from DemoTable1549;
실행 결과:
+---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | demotable1549 | 0 | PRIMARY | 1 | EmployeeId | A | 0 | NULL | NULL | | BTREE | | | YES | | demotable1549 | 1 | name_index1 | 1 | EmployeeName | A | 0 | NULL | NULL | YES | BTREE | | | YES | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ 2 rows in set (0.00 sec)
5. SHOW KEYS 실행
mysql> show keys from DemoTable1549;
실행 결과:
+---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | demotable1549 | 0 | PRIMARY | 1 | EmployeeId | A | 0 | NULL | NULL | | BTREE | | | YES | | demotable1549 | 1 | name_index1 | 1 | EmployeeName | A | 0 | NULL | NULL | YES | BTREE | | | YES | +---------------+------------+-------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ 2 rows in set (0.00 sec)
출력 결과 해석하기
세 구문 모두 동일한 형식의 결과를 반환하며, 주요 컬럼의 의미는 다음과 같습니다.
- Non_unique: 인덱스가 중복 값을 허용하면 1, 고유 인덱스(UNIQUE)면 0입니다. PRIMARY 키는 0으로 표시됩니다.
- Key_name: 인덱스의 이름입니다. 기본 키는 항상 'PRIMARY'로 표시됩니다.
- Seq_in_index: 복합 인덱스일 경우 해당 컬럼이 인덱스 내에서 차지하는 순번입니다.
- Column_name: 인덱스가 적용된 컬럼 이름입니다.
- Cardinality: 인덱스에 저장된 고유 값의 추정 개수로, 옵티마이저가 실행 계획을 세울 때 참고합니다.
- Index_type: 인덱스의 자료구조 유형입니다. InnoDB에서는 일반적으로 BTREE가 사용됩니다.
- Visible: MySQL 8.0부터 지원되는 기능으로, 인덱스의 가시성 여부를 나타냅니다.
결론
SHOW INDEX, SHOW INDEXES, SHOW KEYS는 MySQL에서 서로 다른 이름을 가진 동일한 명령어입니다. 이는 다른 데이터베이스 시스템(예: Oracle의 SHOW INDEX, SQL Server의 sp_helpindex)과의 호환성을 고려해 여러 표기를 지원하는 것입니다. 따라서 개인의 선호나 팀의 코딩 컨벤션에 따라 편하게 선택하여 사용하면 됩니다.