하이위
140
2021-11-17 00:18:37 작성 2021-11-17 00:28:55 수정됨
4
146

mysql rownum이용한 페이징 처리 질문드립니다!!


1번코드

select r2.*  from (

                    select @rownum:=@rownum+1 rownum, notice.* 

                    from notice, (select @rownum:=0) r 

                    order by regdate desc

                    ) r2;


아래의 notice 테이블을 위의 쿼리문을 실행했을때 날짜 내림차순으로 정렬되고 rownum도 순차적으로 잘 입력이 됩니다.

그런데 왜 되는지 모르겠습니다 ㅠ 

from - select - order by 순으로 실행되는데

먼저 rownum이 아래의 테이블에 순차적으로 번호가 입력되고 그 다음 order by절이 실행되니까 부속질의문으로 생성되는 table은 rownum이 뒤죽박죽인 채로 생성되어야 하는것 아닌지 궁금합니다. 

@통해 변수를 생성해서 테이블 컬럼을 추가하는것이 일반적인 연산과는 다른것인가요?


2번코드

select r2.*  from (

                    select @rownum:=@rownum+1 rownum, n.* 

                    from (select * from notice order by regdate desc) n, (select @rownum:=0) r 

                    ) r2;

2번코드처럼 하지 않아도 1번이 2번 코드처럼 동작하는 이유가 궁금하다고 정리할 수 있을것 같습니다!


0
  • 답변 4

  • 장독깨기
    3k
    2021-11-17 08:51:21

    from 절에서는 @rownum 변수를 선언/초기화하고

    select 절에서 @rownum 변수에 +1을 해서 가져온다고 생각하면 될 거 같습니다.

    order by 를 한 다음에 select 를 하겠죠.

    참고로, select row_number() over(order by regdate desc) as rownum, 

    이런식으로 간단히 할 수도 있습니다.

  • 하이위
    140
    2021-11-17 09:19:15

    질문이 있습니다!

    order by절은 select 이후에 실행 되는걸로 알고있는데

    변수를 선언해 사용하면 쿼리 실행순서가 변경되나요?

  • 장독깨기
    3k
    2021-11-19 04:34:57

    음.. select 는 가져오는 항목을 결정하고,

    order by 는 가져오는 순서를 정한다고 보는게 좋을 거 같습니다.

    우리가 쿼리를 요청하면 데이터베이스 엔진은 그걸 해석하고

    효율적인 방법으로 우리에게 데이터를 제공해줄텐데요.

    가령, order by 컬럼에 인덱스가 있으면 따로 정렬할 필요없이 그 순서에 맞게 줄테구요,

    인덱스가 없으면 정렬을 해서 데이터를 줄 겁니다.

    그래서, 꼭 select 후에 order by 를 실행한다라고 생각하면 좀 이상합니다.

    근데, 이걸 또 서브 쿼리로 묶어 버리면 순서가 정해지겠죠.

    select * from (select rownum,* from notice,.. order by 컬럼영) order by 다른 컬럼명;

    이런식으로 하면 순서도 정해지고 rownum 이 바뀔테죠.

    위 예와 같은 경우는 select 항목에 rownum 이라는 변수가 있는거고,

    db 엔진은 데이터를 제공해줄때 select 항목을 볼텐데,

    그때 변수가 있으니 그 변수에 값을 부여해서 제공해준다

    이런식으로 해석하면 무난해보입니다.

    그리고, 실제 실행순서는 실행계획(explain)을 보면 됩니다.

    이걸 보고 우리가 힌트를 부여해 성능 튜닝을 할 수도 있습니다.

  • 하이위
    140
    2021-11-21 02:01:33

    좋은 답변 감사합니다!!!

    더욱 열심히 공부해보겠습니다!

  • 로그인을 하시면 답변을 등록할 수 있습니다.