Foreign Key에도 index가 걸릴까?

RDS를 쓰면 일대다 관계를 정의해서 사용하는 경우가 잦을 것이다.

테이블 간 일대다 관계를 정의하면 테이블 상으로는 PK, FK를 통해 서로 관계를 매핑시킬 것인데 그러면 FK에는 index가 걸려있을까?


아래와 같이 단순한 유저, 게시물의 경우를 생각해보자.

users

id (PK) username nickname
1 devson seoul dev
2 chris Chris Brown

boards

id (PK) user_id (FK) title
1 1 DB tuning
2 2 What should I do??

테이블에서 확인할 수 있는 것과 같이 유저(users)와 게시물(boards)는 1:N 관계이고 users.idboards.user_id를 통해 두 테이블이 매핑이된다.

정보 조회를 위해 특정 유저(user)나 특정 게시물(board)를 조회할 때는 각자 테이블의 id값을 사용할 것이다.

1
2
3
4
5
6
7
8
9
-- 특정 유저 조회
SELECT *
FROM users
WHERE id = ?;

-- 특정 게시물 조회
SELECT *
FROM boards
WHERE id = ?

그리고 특정 유저가 작성한 게시물을 조회해야한다면 아마도 다음과 같이 쿼리를 작성할 것이다.

1
2
3
4
-- 특정 유저의 모든 게시물 조회
SELECT *
FROM boards
WHERE user_id = ?

boards 테이블에서 id column는 PK이기 때문에 index가 걸려있지만, user_id column은 FK지만 따로 명시적으로 index는 걸어놓지 않았다.

그러면 특정 유저의 게시물을 가져오는 경우를 위해 따로 board.user_id에 index를 걸어야 할까?

그것은 DB by DB이다. MySQL과 같은 특정 DB는 FK를 걸면 FK에 index를 걸어주기도 한다.

출처

(stackoverflow의 대답에서는 InnoDB를 사용하는 경우에만 index가 생성된다고 한다)

explain을 통해 쿼리 효율을 확인해보고 관련해서 애매한 부분은 항상 찾아보면서 효율에 타협하지 않도록 하자.

참고:

Share