728x90
MySQL 5.7에서 MySQL 8.0로 업그레이드
최근에 내가 다니는 곳에서 MySQL 5.7 버전에서 8.0 대로 업그레이드 했다.
그냥 그러려니하고 나랑은 별 상관 없는 일이라고 생각하고 있었음 ㅋㅋ
근데 이번 개발건에서 쿼리가 조회가 되지 않았음
SELECT
A.*
FROM
(
SELECT
@ROW_NUMBER := @ROW_NUMBER + 1 AS ROW_NUM
...
) A
WHERE
1 = 1
AND A.PK_NO = #{...}
AND A.ROW_NUM = #{...}
LIMIT 0, 1
뭐 대충 이런 쿼리였는데 암튼,
PK_NO와 ROW_NUM에 해당하는 로우가 없다고 나왔음.
분명히 저 A만 따로 실행시키면 걍 데이터로 나온 애들 중에 해당 PK_NO와 ROW_NUM에 부합하는 데이터가 있는데도...!
MySQL 5.7과 MySQL 8.0의 차이
데이터가 조회되지 않은 이유
알고보니까 MySQL 5.7에서는 사용자 변수를 초기화한 후 행에 번호를 부여하고 정렬된 결과를 반환하지만, MySQL 8.0에서는 정렬된 결과를 기반으로 번호를 부여하고 그 결과를 반환하기 때문이라고 한다!
MySQL 5.7
SET @row_number = 0;
SELECT
@row_number := @row_number + 1 AS row_num,
your_column
FROM
your_table
ORDER BY
your_column;
- 사용자 변수를 이용하여 각 행에 번호를 할당함
- 실행 순서: 먼저 변수를 초기화하고, 각 행에 대해 번호를 부여하고, 그 후 정렬된 결과를 반환
MySQL 8.0
MySQL 8.0에서는 새로운 방법이 생겼음.
SELECT
your_column,
ROW_NUMBER() OVER (ORDER BY your_column) AS row_num
FROM
your_table;
- 윈도우 함수 ROW_NUMBER()를 사용하여 행 번호를 할당함
- 실행 순서: 정렬된 결과를 기반으로 각 행에 번호를 부여하고, 그 후 결과를 반환
주요 차이점
- 문법 및 키워드: MySQL 8.0에서는 명시적인 ROWNUM 키워드가 아니라 ROW_NUMBER() 함수를 사용함
- 기능의 풍부성: MySQL 8.0의 윈도우 함수를 사용하면 더 다양한 윈도우 함수를 활용하여 행을 분석하고 결과를 생성함
- 실행 순서: MySQL 5.7에서는 사용자 변수를 초기화한 후 행에 번호를 부여하고 정렬된 결과를 반환함. MySQL 8.0에서는 정렬된 결과를 기반으로 번호를 부여하고 그 결과를 반환함
- 성능: MySQL 8.0에서 소개된 윈도우 함수는 성능적으로 최적화되어 있을 수 있음. 따라서 윈도우 함수를 사용하는 것이 더 효율적일 수도 ???
이 윈도우 함수라는 것을 적절히 사용하면 더 도움이 될 수도 있다 ~
근데 ROWNUM 쓰는 쿼리 다 바꿔야될 수도 있다고 하더라 ㅋ
조졌슴 ㅎㅎ
728x90