Database/MySQL

[MySQL]MySQL 5.7과 MySQL 8.0의 차이 (1)

GAEBAL 2024. 1. 24. 21:23
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()를 사용하여 행 번호를 할당함

- 실행 순서: 정렬된 결과를 기반으로 각 행에 번호를 부여하고, 그 후 결과를 반환

 

 

주요 차이점

  1. 문법 및 키워드: MySQL 8.0에서는 명시적인 ROWNUM 키워드가 아니라 ROW_NUMBER() 함수를 사용함
  2. 기능의 풍부성: MySQL 8.0의 윈도우 함수를 사용하면 더 다양한 윈도우 함수를 활용하여 행을 분석하고 결과를 생성함
  3. 실행 순서: MySQL 5.7에서는 사용자 변수를 초기화한 후 행에 번호를 부여하고 정렬된 결과를 반환함. MySQL 8.0에서는 정렬된 결과를 기반으로 번호를 부여하고 그 결과를 반환함
  4. 성능: MySQL 8.0에서 소개된 윈도우 함수는 성능적으로 최적화되어 있을 수 있음. 따라서 윈도우 함수를 사용하는 것이 더 효율적일 수도 ???

 

이 윈도우 함수라는 것을 적절히 사용하면 더 도움이 될 수도 있다 ~

 

근데 ROWNUM 쓰는 쿼리 다 바꿔야될 수도 있다고 하더라 ㅋ

조졌슴 ㅎㅎ

728x90