생계/MySQL2021. 7. 31. 13:44

mysql 을 설치 직후 디폴트로 세팅된 변수 값들 중 무엇을 바꾸는게 좋을지 알아보자. 

여기에 나온 예시는 내가 경험해보니 바꿔야 함을 느낀 것들이다. 

사이트 환경은 저마다 다르니 그냥 참고해서 취할건 취한고 아니면 패스 하시길..

 

1. time out

 - interactive_timeout
  : 콘솔에서 mysqld와 Client의 connection 후 다음요청을 기다리는 시간

 - wait_timeout
  : 플러그인, API 등을 이용해 (PHP, JDBC) connection 후 다음요청을 기다리는 시간

   디폴트가 28880 인데 시간으로 환산하면 8시간이 넘는다.

  보통 운영을 이렇게 길게 설정할 필요는 없다.

  lock 을 잡고 sleep 에 빠지는 세션을 줄이기 위해서라도 조정은 필요하다. 

 

2. auto commit

 디폴트는 오토커밋이다. 

 오라클의 디폴트는 오토커밋을 하지 않는것이다.

여기에 익숙해져서 mysql 도 오토커밋을 안하는 것으로 변경을 고려해볼수 있다. 

 다만 mysql 은 select 후에 commit 을 하지 않으면 다른 세션에서 해당 테이블에 DDL 을 날리면 대기에 빠질수있다. 

 

3. 테이블 대소문자 구분 

lower_case_table_names 이라는 변수로 테이블명을 소문자로 바꾸는 것을 세팅할수 있다.

리눅스, 유닉스의 디폴트는 0 이고, 테이블명의 대소문자를 구분 하겠다는 뜻이다. 

Create table Abc ( a int);

Create table abc ( a int);

이런식으로 테이블 생성시 중복 에러 없이 생성이 된다.   

mysql> show variables like 'lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)

lower_case_table_names = 0  :  테이블 생성 및 조회 시 대·소문자 구분한다.
lower_case_table_names = 1  :  테이블명이 모두 소문자로 변경된다. 
lower_case_table_names = 2  :  윈도우에서 대·소문자를 구분해서 테이블생성

윈도우는 1, 맥킨토시는 2 가 디폴트

 

대소문자를 구별했을때의 문제는 쿼리에서 table 이름을 대소문자 그대로 똑같이 입력해야 한다. 

그리고 윈도우에서 파일 시스템이 대소문자를 구분하지 않아서 문제가 발생할수 있다. 

## 이 설정과 상관없이 쿼리에서 alias 를 줄 경우, mysql 은 대문자면 대문자, 소문자면 소문자 그대로 써야 한다. 

select *  from abc A where A.col1 = '1'  (O)

select *  from abc A where a.col1 = '1'   (X)

 

4. isolation level 

디폴트는 repeatable read 이다. 

트랜잭션의 안정성과 동시성은 양립할수 없다. (lock 매커니즘을 사용한다면)

각 사이트 환경에 따라 적절한 트랜잭션 고립 레벨을 고려해볼수 있겠으나

보통 oracle 환경이 READ COMMITTED 였기 때문에 변경을 고려해볼수 있다. 

 

아래는 4가지 transaction isolation level 이다. 

1) read uncommitted 

   => dirty read 가능

2) read committed

   => non-repeatable read 가능

3) repeatable read

   => phantom read 가능 

4) serializable

 

반응형
Posted by 돌고래트레이너