Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 동일한 열에 UNIQUE 제약 조건을 여러 번 추가하면 어떻게 될까?

MySQL에서 동일한 열에 UNIQUE 제약 조건을 여러 번 추가하면, 제약 조건을 추가한 횟수만큼 해당 열에 고유(unique) 인덱스가 생성됩니다. 즉, MySQL은 중복된 제약 조건을 자동으로 병합하지 않고 매번 새로운 인덱스를 만들어냅니다.

예제

'employee' 테이블의 'empid' 열에 이미 UNIQUE 제약 조건이 설정되어 있다고 가정해 보겠습니다. 다음 쿼리로 현재 상태를 확인할 수 있습니다.

mysql> Describe employee;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| empid      | int(11)     | YES  | UNI | NULL    |       |
| first_name | varchar(20) | YES  |     | NULL    |       |
| last_name  | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.12 sec)

DESCRIBE 결과에서 'empid' 열의 Key 값이 UNI로 표시되어 있는데, 이는 해당 열에 고유 제약 조건이 적용되어 있음을 의미합니다.

이 상태에서 SHOW INDEX 쿼리를 실행하면 'empid' 열에 생성된 인덱스는 단 하나뿐입니다.

mysql> Show index from employee\G;
*************************** 1. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

이제 아래 쿼리를 사용하여 동일한 'empid' 열에 UNIQUE 제약 조건을 한 번 더 추가해 보겠습니다.

mysql> Alter table employee ADD UNIQUE(empid);
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0

다시 SHOW INDEX를 실행하면 이번에는 'empid'와 'empid_2', 총 두 개의 인덱스가 조회됩니다. MySQL은 기존 인덱스 이름과의 충돌을 피하기 위해 자동으로 숫자 접미사(_2)를 붙여 새 인덱스 이름을 지정합니다.

mysql> Show index from employee\G;
*************************** 1. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid_2
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
2 rows in set (0.00 sec)

같은 방식으로 UNIQUE 제약 조건을 한 번 더 추가하면 어떻게 될까요?

mysql> Alter table employee ADD UNIQUE(empid);
Query OK, 0 rows affected (0.30 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> Show index from employee\G;
*************************** 1. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid_2
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 3. row ***************************
        Table: employee
   Non_unique: 0
     Key_name: empid_3
 Seq_in_index: 1
  Column_name: empid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
3 rows in set (0.00 sec)

실행 결과, 세 번째 인덱스인 'empid_3'까지 생성된 것을 확인할 수 있습니다.

정리

이처럼 MySQL은 UNIQUE 제약 조건을 추가할 때마다 해당 열에 새로운 고유 인덱스를 생성합니다. 따라서 실무에서는 주의가 필요합니다. 중복 인덱스는 저장 공간을 낭비할 뿐만 아니라 INSERT, UPDATE 작업 시마다 모든 인덱스를 갱신해야 하므로 쓰기 성능을 저하시킬 수 있습니다. 따라서 ALTER TABLE로 UNIQUE 제약 조건을 추가하기 전에 SHOW INDEX 명령으로 기존 인덱스가 이미 존재하는지 먼저 확인하는 것이 좋습니다.