English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL 인덱스 생성 (CREATE INDEX 문법)

이 튜토리얼에서는 테이블에 인덱스를 생성하여 데이터베이스 성능을 향상시키는 방법을 배울 것입니다.

인덱스는 무엇인가요?

인덱스는 테이블과 연결된 데이터 구조로, 하나나 여러 개의 열(인덱스 키)의 값에 기반하여 테이블의 행에 빠르게 접근할 수 있도록 합니다.

가정하면 여러분의 데이터베이스에 다음과 같은 테이블이 있습니다.customers표, 그리고 이름이 알파벳 A로 시작하는 모든 고객을 찾고 싶으시면 다음 명령어를 사용하세요.

SELECT cust_id, cust_name, address FROM customers 
WHERE cust_name LIKE 'A%';

이러한 고객을 찾기 위해 서버는}}customers테이블의 각 행을 스캔하고 이름 열의 내용을 확인합니다. 몇 행밖에 없는 테이블에서는 잘 작동하지만, 만약 테이블이 백만 개의 행을 가지고 있다고 생각해 보세요. 이 경우, 쿼리에 답할 때 걸리는 시간을 생각해 보세요. 이 경우, 인덱스를 테이블에 적용하여 처리 속도를 빠르게 할 수 있습니다.

인덱스 생성

다음 CREATE INDEX 문장을 사용하여 인덱스를 생성할 수 있습니다:

CREATE INDEX index_name ON table_name (column_name);

예를 들어, 고객 테이블의name열에 인덱스를 생성하려면 다음과 같이 사용할 수 있습니다:

CREATE INDEX cust_name_idx ON customers (cust_name);

기본적으로, 인덱스는 중복된 항목을 허용하고 항목을 오름차순으로 정렬합니다. 유일한 인덱스 항목을 요구하려면 CREATE 다음에 UNIQUE 키워드를 추가하십시오. 다음과 같이:

CREATE UNIQUE INDEX cust_name_idx 
ON customers (cust_name);

MySQL에서 특정 테이블에 대한 사용 가능한 인덱스를 확인할 수 있습니다. 다음과 같이 보입니다:

mysql> SHOW INDEXES FROM customers \G

추가적인 팁:SQL 문장을 종료하는 대신 \G를 사용합니다. 결과가 현재 창에 너무 넓으면 표준 테이블 형식 대신 수직으로 표시됩니다.

다중 열 인덱스 생성

데이터베이스에서 이미 테이블을命名한 경우, 예를 들어:사용자열을 가진first_namelast_name이 열을 자주 방문하면, 두 열의 인덱스를 함께 구축하여 성능을 향상시킬 수 있는 사용자의 기록을 만들 수 있습니다. 그림에서 보듯이:

CREATE INDEX user_name_idx ON users (first_name, last_name);

추가적인 팁:데이터베이스 인덱스를 책의 인덱스 부분으로 볼 수 있습니다. 이를 통해 책에서 특정 주제를 빠르게 찾거나 위치를 찾을 수 있습니다.

인덱스의 단점

인덱스는 신중하게 생성해야 합니다. 왜냐하면 테이블에 행을 추가하거나 업데이트하거나 삭제할 때마다 모든 인덱스를 수정해야 하기 때문입니다. 따라서 인덱스가 많을수록 서버가 수행해야 할 작업이 많아지며, 이는 결국 성능 저하로 이어질 수 있습니다.

인덱스를 생성할 때 따를 수 있는 몇 가지 기본 규칙은 다음과 같습니다:

  • 빈번히 데이터를 검색하는 열에 인덱스를 만들십시오.

  • 검색 키로 사용되지 않은 열에 인덱스를 만들지 마십시오.

  • 결합 성능을 개선하기 위해 사용되는 인덱스 열.

  • NULL 값이 많이 포함된 열을 피하십시오.

동일하게, 작은 테이블은 인덱스가 필요하지 않습니다. 왜냐하면 작은 테이블의 경우, 서버가 테이블을 스캔하는 것이 인덱스를 먼저 확인하는 것보다 빠르기 때문입니다.

주의:테이블을 생성할 때, 대부분의 데이터베이스 시스템(MySQL, SQL Server 등)은 자동으로 테이블에PRIMARY KEYUNIQUE컬럼에 인덱스 생성

인덱스 제거

필요하지 않은 인덱스를 제거할 수 있는 다음 문장을 사용할 수 있습니다.

DROP INDEX index_name ON table_name;

다음 문장은 다음에서 인덱스를 제거합니다.customers테이블에서 인덱스 제거cust_name_idx

DROP INDEX cust_name_idx ON customers;

또한,테이블을 제거하십시오,,그래서 모든 관련 인덱스도 제거됩니다.

경고:인덱스를 제거하기 전에 확인해야 할 것이 있습니다. 일반 경험 규칙으로, 인덱스를 무작정 생성하거나 제거하지 마세요.