인덱스(Index)는 RDBMS에서 검색 속도를 높이기 위해 사용하는 하나의 기술이다. 인덱스는 색인이라고도 하며, 테이블의 특정 컬럼을 색인화하여 검색 시 해당 테이블의 레코드를 전부 스캔하는 대신, 색인화된 인덱스 파일을 검색함으로써 검색 속도를 빠르게 한다. 인덱스 구조는 주로 Tree 구조로 색인화되며, RDBMS에서 사용하는 인덱스는 Balance Search Tree를 사용한다.
인덱스를 해당 컬럼에 주게 되면 초기 테이블 생성 시, FRM, MYD, MYI 3개의 파일이 만들어진다.
인덱스를 사용하지 않는 경우, MYI 파일은 비어져 있다. 그러나 인덱스를 해당 컬럼에 만들게 되면, 해당 컬럼을 따로 인덱싱하여 MYI 파일에 입력한다. 이후 사용자가 SELECT 쿼리로 인덱스를 사용하는 쿼리를 실행하면, 해당 테이블을 검색하는 대신 MYI 파일의 내용을 검색한다. 인덱스를 사용하지 않는 SELECT 쿼리라면 테이블을 Full Scan하여 모두 검색한다.
이는 책의 뒷부분에 있는 '찾아보기'와 같은 개념이다. 원하는 단어를 찾아서 페이지수를 보고 쉽게 찾을 수 있는 것과 같다. '찾아보기'가 없다면 처음부터 끝까지 모든 페이지를 보고 찾아야 할 것이다.
따라서 어느 필드를 인덱스해야 하는지 미리 시험해보고 결정하는 것이 좋다. 인덱스를 추가하면 쿼리 속도가 빨라지지만, 데이터 행을 추가하는 속도는 느려지게 되어 여러 사용자가 사용하는 경우 레코드 잠금 문제가 발생할 수 있다. 특정 필드에 대한 인덱스를 만드는 것이 항상 성능을 향상시키는 것은 아니므로 주의해야 한다.
인덱스의 목적은 RDBMS의 검색 속도를 높이는 데 있다. SELECT 쿼리의 WHERE 절이나 JOIN 예약어를 사용했을 때만 인덱스를 사용하며, SELECT 쿼리의 검색 속도를 빠르게 하는데 목적을 두고 있다. DELETE, INSERT, UPDATE 쿼리에는 해당 사항이 없으며, 인덱스 사용 시 오히려 성능이 저하될 수 있다.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
author_id INT,
INDEX (author_id)
);
-- 인덱스 생성
CREATE INDEX idx_title ON posts(title);
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class IndexExample {
public static void main(String[] args) {
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
Statement stmt = conn.createStatement();
// 인덱스 사용하여 검색
String sql = "SELECT * FROM posts WHERE title = 'Example Title'";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("Title: " + rs.getString("title"));
System.out.println("Content: " + rs.getString("content"));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
인덱스는 데이터베이스의 검색 속도를 높이는 데 중요한 역할을 한다. 적절한 필드에 인덱스를 생성하면 쿼리 성능이 향상되지만, 잘못된 사용은 오히려 성능을 저하시킬 수 있다. 인덱스의 장단점을 잘 이해하고, 상황에 맞게 인덱스를 사용하는 것이 중요하다. DELETE, INSERT, UPDATE 쿼리에는 인덱스 사용이 적합하지 않을 수 있으며, SELECT 쿼리의 성능을 최적화하는 데 초점을 맞추는 것이 좋다.