기초공부 - (6) limit & offset

2024. 2. 19. 22:21MySQL/Class

반응형

# limit 와 offset 은 페이징 처리에 유용하게 사용됩니다.

 

1. limit

# 1번째 로우부터 5개 까지만 출력
mysql> select * from temp_limit limit 5;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.00 sec)

# 5번재 이후 로우부터 3개만 출력
mysql> select * from temp_limit limit 5,3;
+------+
| a    |
+------+
|    6 |
|    7 |
|    8 |
+------+
3 rows in set (0.00 sec)

 

2. offset

 -  limit는 단독으로 사용되지만 offset은 limit와 함께 사용해야합니다.

# 3번째부터 10개 가져옴.

# limit 만 사용하였을 경우
mysql> select * from temp_limit limit 3,10;
+------+
| a    |
+------+
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
+------+
10 rows in set (0.00 sec)

# limit, offset 사용하였을 경우
mysql> select * from temp_limit limit 10 offset 3;
+------+
| a    |
+------+
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
+------+
10 rows in set (0.01 sec)

 

3. 단점

# limit 는 full scan을 타지만 결과값이 원하는 수만큼 도달했을 경우 멈춰버립니다.

다르게 얘기를 하자면, "limit 10,2" 일 때 10부터 2개만 읽는 것이 아니라 1부터 10까지 읽고 이후 2개까지 읽은 후 결과값만 도출하고 나머지는 버리게 되는데 이런 경우 리소스가 상당하게 많이 들어갈 수 있다는 것이 limit 의 단점이라고 할 수 있겠습니다.

예를 들어, 위 limit 의 조건에서 10 대신 백만으로 했을 경우 백만까지 읽고 그 다음 2개의 결과값을 읽고 도출합니다. 그리고 읽었던 백만개는 쓸모가 없어 버림을 당한다는 것입니다. 2개를 도출하고자 백만개를 읽는다는 것은 비효율적이지 않을까 생각됩니다.

 

4. 해법(?)

# 이러한 부분을 해결하기 위해서는 인덱스를 이용하는 방법이 있습니다.

 

(1) primary key 일 경우

mysql> select a,b from test.temp_dummy where a between 1 and 10;  # 1페이지
mysql> select a,b from test.temp_dummy where a between 11 and 20;  # 2페이지

 

- 기준이 되는 컬럼이 primary key 일 경우는 변수를 사용하여 조건에 알맞은 값을 넣어주면 된다.

 

(2) 커버링 인덱스(?)

- 특정 쿼리에 추출되는 컬럼들을 모두 인덱스화 하여 직접 데이터를 얻을 수 있는 인덱스입니다.

- 메모리에 모든 데이터가 존재하여 조회 속도가 빨라지는 효과가 있습니다.

- 예를 들어 아래와 같이 조회를 한다고 가정하였을 때 필요한 컬럼들의 인덱스도 함께 생성해 주는 것이 좋습니다.

조회 결과

mysql> create index idx_dummy_a_b_date on temp_dummy(a,b,reg_date);

 

반응형