본문 바로가기

2015/066

MySQL 퍼포먼스 향상 (4) 정규화 4. 정규화와 비정규화 - 정규화 되어진 데이터베이스에서는 팩트가 한나씩 존재하지만, 비정규화에서는 정보가 중복되어 있다. - 퍼포먼스 문제를 해결하기 위해 스키마 정규화는 좋은 방법이다. 왜냐하면 정규화는 비정규화보다 고속이며 정규화 되어진 데이터는 중복해서 존재할 가능성도 적기 때문에 데이터가 적어져 메모리에 올리는데 부담이 적기 때문이다. - 정규화의 결점은 테이블의 결합이 자주 발생하는 것이다. 일부의 인덱스를 사용 불가능해지기도 한다. - 비정규화 스키마 정의는 모두 한 테이블에 포함되어 있어서 결합할 필요가 없다. 테이블 결합이 발생하지 않는 경우 테이블을 풀 스캔 해버린다. 랜덤한 I/O 를 회피하기 때문에 퍼포먼스가 좋아지는 경우가 있다. 또한 인덱스를 사용하기도 좋다. - 비정규화의 문제.. 2015. 6. 20.
MySQL 퍼포먼스 향상 (3) 인덱스 3. 인덱스 B-tree 인덱스 - 인덱스는 데이터 사이즈에 비례한다. - 인덱스는 스토리지 계층에서 사용되며 엔진마다 조금씩 동작이 다르다. - MySQL 의 거의 모든 스토리지 엔진은 B-Tree 인덱스이다. - B-Tree 인덱스는 키, 키 범위, 키 프리픽스에 의한 검색에 적절하다. - MyISAM 은 인덱스가 압축됨. InnoDB 는 인덱스를 압축하지 않음. - MyISAM 은 물리적 위치로 인덱스를 참조하지만, InnoDB 는 주키로 참조한다. - LIKE 검색에서는 그 열의 인덱스는 사용불가 해시 인덱스 - 검색 값을 주면 해시 함수를 통해 결과값을 가지고 찾는다. 해시함수 결과에 대한 값을 저장하기 때문에 컬럼길이가 아무리 길어도 저장되는 양은 현저히 줄어든다는 장점이 있다. - 실제 저장.. 2015. 6. 20.
MySQL 퍼포먼스 향상 (2) 스키마 최적화 2. 스키마 최적화, 그리고 인덱스 데이터형 지정 관련 - 데이터형은 사용가능한 가장작은 형을 사용해야 한다. - 문자보다는 숫자같이 단순한 형이 좋다. - 필드는 NOT NULL 로 지정하고 디폴트 값을 넣자. NULL 로 지정하면 MySQL 내부에서 처리를 해야하고 인덱스 붙이기에도 적절하지 않다. 날짜 관련 - DATETIME, TIMESTAMP 의 차이. TIMESTAMP 는 반의 용량을 사용하며, 타임존에도 대응한다. 숫자형 관련 - 정수형도 좀더 세분하게 나눠서 정의하자. 무조건 INT 는 피하자 - 정수계산은 32 비트 아키텍처라 하도 64비트로 계산된다. - double, float, decimal 같은 실수형. decimal 은 소수점 계산이 가장 정확하다. 돈 계산같은 정확한 계산에 필.. 2015. 6. 20.
MySQL 퍼포먼스 향상 (1) 아키텍처 1. MySQL 의 아키텍처 우선 MySQL 의 아키텍처 면에서 퍼포먼스를 생각해보자. MySQL 은 논리적 3 계층으로 구성되어짐. - 접속관리 및 시큐리티 : 유저 1 명당 1개의 스레드가 작성되어지며, 항상 캐쉬처리 된다. - 최적화 및 실행 : 쿼리실행, 캐쉬, 함수, 프로시져, 트리거, 인덱스 등의 동작 - 스토리지 엔진 : Row Lock 데이터베이스 락 - MySQL 스레드에서 각 유저에 대한 처리를 동시적으로 처리하기 때문에, 동기화 전략이 필요하다. Lock기법을 통해 각 스레드가 쿼리순서를 동기화 시킨다. - 공유락은 트랜잭션에 읽기 허용. 배타락과는 충돌한다. 다른 트랜잭션은 공유락에 걸린 열을 읽기 O - 배타락은 트랙잭션에 갱신과 삭제를 허용. 공유락, 배타락 모두 충돌한다. 다른.. 2015. 6. 20.
반응형