1. tmp table

검색해보면 tmp_table_size가 global 메모리 영역으로 계산하는 글이 많다.

나도 처음엔 global 메모리에서만 사용되는 설정값인 줄 알았으나,

session 메모리에서 사용되는 설정값이란 걸 나중에 알았다.

즉, 쿼리마다 각각의 tmp table을 사용하는 것이다. (mariadb도 마찬가지)

 

mysql 5.7 버전 이하에는 DB에 접속하는 세션이 많아질수록 tmp table은 끝없이 증가하여

메모리가 엄청 할당될 수 있다.

그러나, mysql 8.0에서는 tmp table의 메모리 한계치 설정값이 등장했다

이름하여, temptable_max_ram...

디폴트는 전체 메모리의 3%이고 최소 1GB에서 최대 4GB까지 늘릴 수 있다 라고 공식문서에 나와있는데

근데 막상 설치하면 1GB로 잡혔다..

뭐 어쨋든...

아무리 많은 세션이 들어와서 tmp table을 사용하더라도 최대 1GB까지 사용할 수 있는 것이다.

만약 1GB를 모두 사용하고 있다면, 세션들은 디스크를 사용하여 성능이 무척 느려질 것이다.

업그레이드 시 한번 주목해볼만하다

 

2. character set 및 collation

5.7의 utf8이 8.0부터는 utf8mb3로 이름이 바뀐다

우리는 한글을 쓰기에 보통 utf8을 사용할 것이다.

근데 기존 utf8로 인코딩되는 3bytes로는 요즘 사용되는 emoji 이모티콘을 저장할 수 없어서

utf8mb4라는 게 생겨나고 4bytes로 저장된다.

그렇다고 모든 문자가 4bytes로 저장되는 건 아니고

3bytes로 저장되는건 3bytes로 저장되고 4bytes로 저장되는건 4bytes로 저장된다

 

무엇보다 collation.... 문제...

5.7에도 utf8mb4가 있는데 collation 디폴트가 utf8mb4_general_ci 이다

근데 8.0의 디폴트는 utf8mb4_0900_ai_ci 이다.

이 두 개가 골때리는게... 한글 비교시 좀 안맞을 수 있다.

물론 정렬할 때도 달라질 수 있음

다음의 코드를 보면 이해가 빠를거 같다

mysql> insert into t_test values (1, '가'), (2, 'ㄱㅏ'),(3, '가 ');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t_test;
+----+--------+
| id | c1     |
+----+--------+
|  1 | 가     |
|  2 | ㄱㅏ   |
|  3 | 가     |
+----+--------+
3 rows in set (0.01 sec)

-- utf8mb4_0900_ai_ci 
mysql> select *, length(c1) from t_test where c1='가';
+----+--------+------------+
| id | c1     | length(c1) |
+----+--------+------------+
|  1 | 가     |          3 |
|  2 | ㄱㅏ   |          6 |
+----+--------+------------+
2 rows in set (0.01 sec)

-- utf8mb4_general_ci
mysql> select *, length(c1) from t_test2 where c1 = '가';
+----+------+------------+
| id | c1   | length(c1) |
+----+------+------------+
|  1 | 가   |          3 |
|  3 | 가   |          4 |
+----+------+------------+
2 rows in set (0.00 sec)

 

3. 기타 등등

MySQL 8.0에서는 다음의 설정 파라미터들은 주석 처리 or 제거해줘야 한다.

  • max_tmp_tables
  • query_cache_type
  • query_cache_size
  • innodb_file_format
  • innodb_file_format_max

그리고 sql_mode에서 NO_AUTO_CREATE_USER 옵션도 제거해줘야 하고...

또 rank 같은 예약어는 못사용하니 기존에 사용되는 프로시저 다 확인도 해봐야 한다.

마지막으로 lower_case_table_names 설정은 8.0부터 첫 기동시에만 설정할 수 있고 운영 중에는 변경이 불가능하다.

 

8.0 부터는 MySQL이 좀 더 엄격해진거 같은 느낌이 많이 든다.

기존 5.7에는 Datetime 데이터에 empty value를 비교해도 warning이 뜨고 동작되는 반면

8.0은 에러 뜨면서 쿼리가 작동하지 않는다.

부동소수점 관련해서도 

5.7은 '1e+52' 값이 insert되긴 하는데... 8.0은 들어가지 않는다.

해당 데이터를 유지한채 업그레이드를 하면 기존에 들어간 데이터는 에러로 나오진 않는다.

 

일단 기억나는건 이정도로 일하다가 더 있으면 업데이트할 예정.

+ Recent posts