인덱스(Index)
인덱스는 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용된다.
인덱스의 설명은 해당 블로그에 정리했으니 바로 다음으로 넘어가겠다.
먼저 테이블에 등록된 인덱스 목록을 살펴보자
SHOW INDEX
FROM [테이블명]
Table | 테이블의 이름을 표시 |
Non_unique | 인덱스가 중복된 값을 저장할 수 있으면 1, 없으면 0을 표시 |
Key_name | 인덱스의 이름을 표시하며, 인덱스가 해당 테이블의 기본 키라면 PRIMARY로 표시 |
Seq_in_index | 인덱스에서의 해당 필드의 순서를 표시 |
Column_name | 해당 필드의 이름을 표시 |
Collation | 인덱스에서 해당 필드가 정렬되는 방법을 표시 |
Cardinality | 인덱스에 저장된 유일한 값들의 수를 표시 |
Sub_part | 인덱스 접두어를 표시 |
Packed | 키가 압축되는 방법을 표시 |
Null | 해당 필드가 NULL을 저장할 수 있으면 YES를 표시하고, 저장할 수 없으면 ''를 표시 |
Index_type | 인덱스에 사용되는 메소드를 표시 |
Comment | 해당 필드를 설명하는 것이 아닌 인덱스에 관한 기타 정보를 표시 |
Index_comment | 인덱스에 관한 모든 기타 정보를 표시 |
user 테이블을 만들면서 인덱스를 새로 생성해 보았다.
위의 표에서 나온 여러 가지 인덱스 정보를 가지고 확인할 수 있다.
ALTER TABLE [테이블명] DROP INDEX [인덱스_이름]
인덱스를 삭제할 때는 우리가 일반적으로 생각하는 DDL에서 DROP 문과는 살짝 다르다.
뷰(View)
뷰는 하나 이상의 테이블로부터 유도되어 만들어진 가상의 테이블이다.
다른 테이블이나 다른 뷰에 저장되어 있는 데이터를 보여주는 역할만을 수행한다.
실제 테이블처럼 행과 열을 가지지만, 실제 데이터를 저장하는 것은 아니다.
예제를 살펴보면 salaryView를 생성하여 급여가 150,000이 넘는 직원의 번호와 급여를 출력해 주는 뷰를 생성하고 출력해 보았다.
이렇게 미리 뷰를 만들어서 가상의 테이블을 만들어 다음에 같은 정보를 원할 때 SELECT 문을 다 작성하는 것이 아닌 미리 생성한 뷰를 통해서 데이터를 확인할 수 있다.
CREATE VIEW [뷰_이름] AS
SELECT [컬럼명], [컬럼명], ...
FROM [테이블명]
WHERE [조건];
생성된 뷰가 더 이상 필요하지 않으면 DROP 문을 사용하여 삭제할 수 있다.
DROP VIEW [뷰_이름]
조금 더 복잡한 쿼리문으로 뷰를 생성해보자.
뷰를 통해서 해당 SELECT 문이 필요할 때 뷰 이름을 통해서 쉽게 조회할 수 있고, 쿼리를 재사용할 수 있다는 것이 뷰의 장점이자 사용하는 이유이다.
앞서 예시를 본 것과 같이 뷰는 주로 조회하는 용도로 사용한다. 많이는 사용하지 않지만 뷰를 업데이트할 수 있는데 특정 조건을 만족해야 사용할 수 있기 때문에 많은 제약 조건으로 인해서 잘 사용하지 않는다.
뷰를 업데이트하기 위한 제약 조건으로는 아래와 같다.
1. 뷰를 생성하는 데 사용되는 SELECT 문에는 GROUP BY 절이나 ORDER BY 절이 포함되어서는 안 된다.
2. SELECT 문에는 DISTINCT 키워드가 없어야 한다.
3. 뷰에는 모든 NOT NULL 값이 있어야 한다.
4. 중첩된 쿼리나 복잡한 쿼리를 사용하여 뷰를 생성하면 안 된다.
5. 뷰는 단일 테이블에서 생성되어야 한다. 여러 테이블을 사용하여 뷰를 생성한 경우 뷰를 업데이트할 수 없다.
위의 5가지 제약 조건중 하나라도 만족하지 못한다면 뷰를 업데이트할 수 없게 된다. 따라서 뷰를 업데이트하는 것은 잘 사용하지 않는다.
뷰의 장단점
장점
- 특정 사용자에게 테이블 전체가 아닌 필요한 부분만을 보여주는 것이 가능하다.
- 복잡한 쿼리를 단순화할 수 있다.
- 쿼리의 재사용이 가능하다.
단점
- 삽입, 삭제, 갱신 작업에 많은 제한 사항이 있다.
- 자신만의 인덱스를 가질 수 없다.
'DB' 카테고리의 다른 글
Mysql - Replication (1) | 2023.11.13 |
---|---|
데이터베이스 - DB 이중화 (0) | 2023.11.12 |
데이터베이스 - 인덱스 (0) | 2023.11.10 |
MySQL - SELECT (1) | 2023.11.09 |
MySQL - SQL (0) | 2023.11.09 |