English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 테이블에 인덱스를 생성하여 데이터베이스 성능을 향상시키는 방법을 배울 것입니다.
인덱스는 테이블과 연결된 데이터 구조로, 하나나 여러 개의 열(인덱스 키)의 값에 기반하여 테이블의 행에 빠르게 접근할 수 있도록 합니다.
가정하면 여러분의 데이터베이스에 다음과 같은 테이블이 있습니다.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_name및last_name이 열을 자주 방문하면, 두 열의 인덱스를 함께 구축하여 성능을 향상시킬 수 있는 사용자의 기록을 만들 수 있습니다. 그림에서 보듯이:
CREATE INDEX user_name_idx ON users (first_name, last_name);
추가적인 팁:데이터베이스 인덱스를 책의 인덱스 부분으로 볼 수 있습니다. 이를 통해 책에서 특정 주제를 빠르게 찾거나 위치를 찾을 수 있습니다.
인덱스는 신중하게 생성해야 합니다. 왜냐하면 테이블에 행을 추가하거나 업데이트하거나 삭제할 때마다 모든 인덱스를 수정해야 하기 때문입니다. 따라서 인덱스가 많을수록 서버가 수행해야 할 작업이 많아지며, 이는 결국 성능 저하로 이어질 수 있습니다.
인덱스를 생성할 때 따를 수 있는 몇 가지 기본 규칙은 다음과 같습니다:
빈번히 데이터를 검색하는 열에 인덱스를 만들십시오.
검색 키로 사용되지 않은 열에 인덱스를 만들지 마십시오.
결합 성능을 개선하기 위해 사용되는 인덱스 열.
NULL 값이 많이 포함된 열을 피하십시오.
동일하게, 작은 테이블은 인덱스가 필요하지 않습니다. 왜냐하면 작은 테이블의 경우, 서버가 테이블을 스캔하는 것이 인덱스를 먼저 확인하는 것보다 빠르기 때문입니다.
주의:테이블을 생성할 때, 대부분의 데이터베이스 시스템(MySQL, SQL Server 등)은 자동으로 테이블에PRIMARY KEY및UNIQUE컬럼에 인덱스 생성
필요하지 않은 인덱스를 제거할 수 있는 다음 문장을 사용할 수 있습니다.
DROP INDEX index_name ON table_name;
다음 문장은 다음에서 인덱스를 제거합니다.customers테이블에서 인덱스 제거cust_name_idx。
DROP INDEX cust_name_idx ON customers;
또한,테이블을 제거하십시오,,그래서 모든 관련 인덱스도 제거됩니다.
경고:인덱스를 제거하기 전에 확인해야 할 것이 있습니다. 일반 경험 규칙으로, 인덱스를 무작정 생성하거나 제거하지 마세요.