2024. 2. 19. 22:21ㆍMySQL/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);
'MySQL > Class' 카테고리의 다른 글
M2(Mac)용 VMWare로 가상화 만들기 - (6) In-place upgrade (2) | 2024.02.27 |
---|---|
기초공부 - (7) 매개변수 이름을 테이블명으로 사용한다면 (0) | 2024.02.21 |
기초공부 - (5) 더미 데이터 넣기 (0) | 2024.02.12 |
기초공부 - (4) isolation(고립,독립,격리) (0) | 2024.02.05 |
기초공부 - (3) sleep 세션 정리 하기(interactive_timeout, wait_timeout) (0) | 2024.01.30 |