MySQL 속도 높이기
페이지 정보
작성자 오원장쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 7,565회 작성일 11-07-27 18:21본문
MySQL 속도 높이기
작성자 : 고승현 (powflash@dreamwiz.com : 2001년 9월 5일)
- 서버 측면 : 컴파- 일 방법, 버퍼 크기 조정
- SQL 언어 : 효율적인 SQL 언어 사용, 자료형 선택, 테이블 디자인, 인덱스 사용
1. 서버 측면 :
- 컴파- 일러를 gcc 대신 pgcc 를 이용하고 -O6 옵션을 주어 컴파- 일 하면 MySQL 서버는 약 11% 정도 빨라 집니다.
- 공유 라이브- 러리를 사용하면 약 13% 정도 속도가 느려집니다. 공유 라이브- 러리는 여러 프로그램에서 하나의 라이브- 러리를 사용하게 하여 메모리를 절약하지만, 속도가 약간 느려집니다. 컴파- 일 할 때 -static 옵션을 주면 공유 라이브- 러리를 사용하지 않게 됩니다. 공유 라이브- 러리를 사용하지 않으면 속도는 빠르지만 메모리를 많이 차지하게 됩니다.
- 유닉스 소켓을 사용하는 것이 TCP/IP를 사용하는 것보다 빠릅니다.
- Sun SparcStation 10 에서는 Sun Pro C++ 4.2 컴파- 일러를 사용하는 것보다 gcc를 사용하는 것이 13%정도 빠릅니다.
- Solaris 2.5.1에서는 솔라리스 자체의 스레드를 이용하는 것이 MIT-pthread를 이용하는 것보다 빠릅니다.
1) MySQL 을 정적으로 컴파2) 일 하기
$ ./configure --with-client-ldflags=--all-static --with-mysql-ldflags=all-static
3) 심벌릭 링크의 사용
여러 데이터베이스를 서로 다른 하드디스크로 나누어서 심볼릭 링크를 이용하여 접근하는 방법이다. 이때 하나의 디스크의 여러 데이터베이스로 접근하는 것보다 여러 디스크로 나누어진 데이터 베이스로 접근 하는 것이 빠른 것은 자명한 일이다.
4) 버퍼의 크기 조정
mysqladmin variables 를 이용하여 버퍼의 종류와 현재 버퍼의 크기를 알 수 있다.
다음은 중요한 버퍼들이다.
key_buffer_size 인덱스를 저장하는 버퍼의 크기
max_connections MySQL에 접속하는 클라이언트의 최대 수
table_cache 테이블 캐시의 크기
record_buffer 테이블을 순차적으로(Sequential) 탐색할 경우 사용하는 버퍼의 크기
sort_buffer 정렬에 관련된 버퍼의 크기
MySQL Daemon 을 실행할 때 table_cache의 크기를 256 바이트로 만듦
$safe_mysqld -O table-cache=256 &
$safe_mysqld -set-variable table-cache=256 &
단위는 기본은 byte 이며, K 는 킬로바이트 M 은 메가 바이트이다.
key_buffer_size : 인덱스를 저장하는 버퍼의 크기를 지정하는 변수
max_connections : MySQL 서버에 동시에 접속할 수 있는 클라이언트의 최대 수이다.
table_cache : 테이블과 관련된 파일 기술자(File Descriptor)를 저장하는 캐시이다.
record_buffer, sort_buffer : 다른 버퍼는 MySQL 서버에 할당 되지만, record_buffer와 sort_buffer는 각 클라이언트 당 하나의 버퍼가 할당되므로 이 두 버퍼의 크기를 너무 크게 하면 시스템의 메모리가 모두 소진되는 경우가 발생할 수도 있다.
예 :
- 메모리가 256M 이상이고 테이블의 수가 많은 경우
$ safe_mysqld -O key_buffer=64M -O table_cache=256 -O sort_buffer=4M record_buffer=1M &
- 메모리가 128M 정도이고 테이블의 수가 적으며 정렬을 많이 사용하는
시스템의 경우
$ safe_mysqld -O key_buffer=16M-O sort_buffer=1M &
- 메모리가 적고 클라이언트의 연결이 많은 시스템의 경우
$ safe_mysqld -O key_buffer=512K -O sort_buffer=16K -O table_cache=32 -O record_buffer=8K -O net_buffer=1K &
5) 클라이언트가 서버에 연결할 때는 Persistent 한 연결을 할 것
6) select 문을 쓸 때는 인덱스를 사용하는 지 확인.
7) 메모리가 충분히 있으면 스왑 메모리를 사용하지 말 것.
8) 칼럼에 Default value를 사용할 것.
9) UDF(User Defined Function)를 이용할 것
10) 레코드에 유일한 값을 저장할 때는 AUTO_INCREMENT 칼럼을 이용
2. SQL 언어 사용 측면 과 테이블 설계 측면 :
1) 인덱스를 사용할 것
인덱스를 사용하면 검색 속도를 빠르게 할 수 있다. 인덱스의 효과를 가장 많이 볼 수 있는 경우는 여러 테이블 사이에 JOIN을 하는 경우이다. 이유는 JOIN을 할 경우 그 레코드들의 수가 기하 급수적으로 늘어나기 때문에 검색 회수가 매우 많아지는데 인덱스를 사용하면 그 수를 줄일 수 있기 때문이다.
예를 들어 1000*1000*1000 = 10억번의 비교를 해야 하므로 검색속도가 매우 느려질 것이다.
2) 칼럼 타입의 선택을 신중히 할 것
- 최대한 크기가 작은 칼럼 타입을 선택할 것
- 꼭 필요한 칼럼만 인덱스로 만들 것
- varchar 보다는 char를 사용할 것
- 가능하면 ENUM 형을 사용할 것
- NOT NULL을 사용할 것
- POCEDURE ANALYSE()를 사용할 것
- BLOB 나 TEXT 칼럼은 다른 테이블로 만들 것
3) INSERT 문을 빠르게 사용할 것
참고 : 데이터베이스 시스템의 자료구조는 일반적으로 해싱을 사용한다. 이는 삽입은 느리지만, 검색 속도가 다른 자료구조에 비해 빠르기 때문이다. 해싱은 여러 개의 버켓과 그에 따른 리스트의 구조로 이루어져 있다.
작성자 : 고승현 (powflash@dreamwiz.com : 2001년 9월 5일)
- 서버 측면 : 컴파- 일 방법, 버퍼 크기 조정
- SQL 언어 : 효율적인 SQL 언어 사용, 자료형 선택, 테이블 디자인, 인덱스 사용
1. 서버 측면 :
- 컴파- 일러를 gcc 대신 pgcc 를 이용하고 -O6 옵션을 주어 컴파- 일 하면 MySQL 서버는 약 11% 정도 빨라 집니다.
- 공유 라이브- 러리를 사용하면 약 13% 정도 속도가 느려집니다. 공유 라이브- 러리는 여러 프로그램에서 하나의 라이브- 러리를 사용하게 하여 메모리를 절약하지만, 속도가 약간 느려집니다. 컴파- 일 할 때 -static 옵션을 주면 공유 라이브- 러리를 사용하지 않게 됩니다. 공유 라이브- 러리를 사용하지 않으면 속도는 빠르지만 메모리를 많이 차지하게 됩니다.
- 유닉스 소켓을 사용하는 것이 TCP/IP를 사용하는 것보다 빠릅니다.
- Sun SparcStation 10 에서는 Sun Pro C++ 4.2 컴파- 일러를 사용하는 것보다 gcc를 사용하는 것이 13%정도 빠릅니다.
- Solaris 2.5.1에서는 솔라리스 자체의 스레드를 이용하는 것이 MIT-pthread를 이용하는 것보다 빠릅니다.
1) MySQL 을 정적으로 컴파2) 일 하기
$ ./configure --with-client-ldflags=--all-static --with-mysql-ldflags=all-static
3) 심벌릭 링크의 사용
여러 데이터베이스를 서로 다른 하드디스크로 나누어서 심볼릭 링크를 이용하여 접근하는 방법이다. 이때 하나의 디스크의 여러 데이터베이스로 접근하는 것보다 여러 디스크로 나누어진 데이터 베이스로 접근 하는 것이 빠른 것은 자명한 일이다.
4) 버퍼의 크기 조정
mysqladmin variables 를 이용하여 버퍼의 종류와 현재 버퍼의 크기를 알 수 있다.
다음은 중요한 버퍼들이다.
key_buffer_size 인덱스를 저장하는 버퍼의 크기
max_connections MySQL에 접속하는 클라이언트의 최대 수
table_cache 테이블 캐시의 크기
record_buffer 테이블을 순차적으로(Sequential) 탐색할 경우 사용하는 버퍼의 크기
sort_buffer 정렬에 관련된 버퍼의 크기
MySQL Daemon 을 실행할 때 table_cache의 크기를 256 바이트로 만듦
$safe_mysqld -O table-cache=256 &
$safe_mysqld -set-variable table-cache=256 &
단위는 기본은 byte 이며, K 는 킬로바이트 M 은 메가 바이트이다.
key_buffer_size : 인덱스를 저장하는 버퍼의 크기를 지정하는 변수
max_connections : MySQL 서버에 동시에 접속할 수 있는 클라이언트의 최대 수이다.
table_cache : 테이블과 관련된 파일 기술자(File Descriptor)를 저장하는 캐시이다.
record_buffer, sort_buffer : 다른 버퍼는 MySQL 서버에 할당 되지만, record_buffer와 sort_buffer는 각 클라이언트 당 하나의 버퍼가 할당되므로 이 두 버퍼의 크기를 너무 크게 하면 시스템의 메모리가 모두 소진되는 경우가 발생할 수도 있다.
예 :
- 메모리가 256M 이상이고 테이블의 수가 많은 경우
$ safe_mysqld -O key_buffer=64M -O table_cache=256 -O sort_buffer=4M record_buffer=1M &
- 메모리가 128M 정도이고 테이블의 수가 적으며 정렬을 많이 사용하는
시스템의 경우
$ safe_mysqld -O key_buffer=16M-O sort_buffer=1M &
- 메모리가 적고 클라이언트의 연결이 많은 시스템의 경우
$ safe_mysqld -O key_buffer=512K -O sort_buffer=16K -O table_cache=32 -O record_buffer=8K -O net_buffer=1K &
5) 클라이언트가 서버에 연결할 때는 Persistent 한 연결을 할 것
6) select 문을 쓸 때는 인덱스를 사용하는 지 확인.
7) 메모리가 충분히 있으면 스왑 메모리를 사용하지 말 것.
8) 칼럼에 Default value를 사용할 것.
9) UDF(User Defined Function)를 이용할 것
10) 레코드에 유일한 값을 저장할 때는 AUTO_INCREMENT 칼럼을 이용
2. SQL 언어 사용 측면 과 테이블 설계 측면 :
1) 인덱스를 사용할 것
인덱스를 사용하면 검색 속도를 빠르게 할 수 있다. 인덱스의 효과를 가장 많이 볼 수 있는 경우는 여러 테이블 사이에 JOIN을 하는 경우이다. 이유는 JOIN을 할 경우 그 레코드들의 수가 기하 급수적으로 늘어나기 때문에 검색 회수가 매우 많아지는데 인덱스를 사용하면 그 수를 줄일 수 있기 때문이다.
예를 들어 1000*1000*1000 = 10억번의 비교를 해야 하므로 검색속도가 매우 느려질 것이다.
2) 칼럼 타입의 선택을 신중히 할 것
- 최대한 크기가 작은 칼럼 타입을 선택할 것
- 꼭 필요한 칼럼만 인덱스로 만들 것
- varchar 보다는 char를 사용할 것
- 가능하면 ENUM 형을 사용할 것
- NOT NULL을 사용할 것
- POCEDURE ANALYSE()를 사용할 것
- BLOB 나 TEXT 칼럼은 다른 테이블로 만들 것
3) INSERT 문을 빠르게 사용할 것
참고 : 데이터베이스 시스템의 자료구조는 일반적으로 해싱을 사용한다. 이는 삽입은 느리지만, 검색 속도가 다른 자료구조에 비해 빠르기 때문이다. 해싱은 여러 개의 버켓과 그에 따른 리스트의 구조로 이루어져 있다.
댓글목록
등록된 댓글이 없습니다.