mysql 튜닝(첫번째 강좌) ~~

튜닝의 절차은 두가지로 나누워 집니다. ^^
하나은 SQL/DB 구조 튜닝이구여 다른 하나은 서버 셋팅 이 있는되여
차례되로 알아보도록 하겟습니다.

SQL 튜닝
 :EXPLAIN과 SELECT 명령을 이용하여 SQL문이 어떻게 실행되는지 인덱스가 사용되는지 JOIN은 어떤씩으로 구현된느지 등에 대한 정보를 알 수 잇습니다. ^^
질의문의 성능은 일반적으로 디스크 검색 횟수에 따라 측정이 가능한되 myisamchk 등의 프로그램을 이용하여 DB의 상태를 분석하고 인덱스에 따라 정렬을 하는 등의 최적화작업을 수행할 수 잇어여 ^^ 또한
where distinct, join, limit 등의 사용방법에 따라 최적화의 방법이 있으며  insert, update, delete 등의 질의를 수행하는 경우에도 효울적인 방법을 사용해야 합니다. ^^
예를 들어 테스트 파일의 데이터를 입력할 경우 INSERT 문을 사용하는 것보다은 LOAD DATA INFILE 명령을 이용하는 것이 훨씬 속도가 빠르며 여러 개의 레코드를 입력할 경우에는 개별적으로 입력을 하는 것보다 하나의 INSERT 문을 이용하는 것이 빠릅니다.
또한 서브 쿼리을 이용한 방법 (mysql 5.0 부터 된다죠 아마 ^^) 보다은 JOIN 을 이용한 방법이 훨씬 속도에서 빠릅니다.  그리고 여러개의 레코드을 입력할 겨우에는 개별적으로 입력을 하는것보다은 하나의 INSERT 문을 이용하는 것이 더 빠른니다. ^^
예을 들어
하나의 테이블에 값을 입력하고 싶을때
insert into a values (1,1)
nsert into a values (2,2)
nsert into a values (3,3)
이렇게 하는것보다은
nsert into a values (1,1),(2,2),(3,3)  이렇게 한번에 입력하는것이 더욱 빠릅니다.
이 이유은 INSERT은 버퍼을 사용하기 때문에 버퍼에 한번에 저장해서 한번에 수행하게 됩니다.  하나씩 할겨우은 INSERT 가 발생할때 마다 버퍼을 참조 하기 때문에 그만큼 수행하는되 오래 걸릴수 었어여 ^^
버퍼에 관한건 다음 기회가 되면 다시 한번 정리해 보겠습니다.  ^^ (워낙 많이 내용에 심오하다보니 -ㅁ-;;; )

DB 구조 설제
: mysql은 데이터와 인덱스 파일을 별도로 두는 구조로 되어 있습니다. DB 구조를 설계하는 경우 가급적 데이터을 작게 만드는 것이 중요해여 ^^ 이는 저절한 컬럼 타입 선택, not null  사용, ENUM 사용들이 포함되는되 인덱스의 경우 DB의 성능에 많은 영향을 미치는되 무조건 인덱스을 쓴다고 성능이 빨라지는 것은 아니며 서비스의 특징에 따라 인덱스를 사용해야 해여 ^^ 또한 인덱스를 사용한다고 해도 적절하게 SQL 문을 작성하지 않으면 실제로는 사용을 하지 못하는 경우가 생길수 있으니 주의해야 되여 ^^
인덱스 사용은 EXPLAIN 명령으로 확인을 할수 잇는되 서버관련 변수중 table_cache, max_connections 는 서버가 열 수 있는 최대 파일 갯수오 ㅏ연관을 가지고 있어여 ^^ MAX_connetions는 서버에 동시 접속할수 있는 클라이언트의 최대수를 지정하고 table_cache는 모든 스레드에서 열수 잇는 테이블 숫자를 지정하므로 테이블과 연관된 파일 기술자와 관련이 있기 때문이에여  서버에서 열어야 할 테이블 갯수를 미리 예측하여 수치을 조정하는 작이 필요합니다.
그럼 구체적으로 설명을 드릴게여 ^^

--------------------------------
| aa | bb | cc | dd | ee | ff | gg |
--------------------------------
| 1   | 3   | 3   | 6  |  5   | 6 | 8   |
--------------------------------
| 1   | 4   | 2   | 3  |  6   | 6 | 8   |
________________________________
|2    | 3   | 2   | 6  |   6  | 7 | 1   |     
---------------------------------
다음 처럼 테이블구조와 값이 이러할때 PK은 어떻게 할까여
참조해서 쓰는 필드은 전부 다 써여 그럼 다연히 인덱스 을 걸어주는게 빠르겟죠  ^^
:==>  앞에 일련번호을 넣어 사용한다 ^^
맞은 대답일수도 잇구 아닐수도 잇어여 
PK을 생각한다면 있는게 좋겟죠 하지만 일련번호을 사용하지 않는다면 오히려 손해가 될수 있어여 ^^ 그럼 어떻게 하냐 전부을 묶어서 PK을 잡으면 됩니다. 그럼 개별적으로 인텍스을 않걸어져도 PK이기 때문에 인덱스가 자동 생성 ^^ 그러 효울적으로 검색이 가능하게 되겟죠 ^^ 하지만 너무 많은량이거나 전체값을 찾아야 될경우은 일련번호을 넣어주는것이 오히려 효과적일수 잇습니다. ^^ 애매 하시는 분들은 직접 테스트 하셔서 결과값을 확인보시구 빠른것을 선택해 주심 됩니다. ^^

서버 셋팅
: 주로 시스템 및 mysql 서버와 관련한 셋팅 부분인되 현재 mysql에서 다중 cpu 기능을 잘 활용할 수 있는 운영체제로는 솔라리스와 리눅스 가 좋습니다. ^^ 리눅스에서 2G 파일 한꼐는 커널 2.4에 들어오면서부터 제약이 없어졋구, 컴파일 및 링크시에는 정적(STATIC)으로 링크하는 것이 더 빠른 속도를 낼 수 있으며, gcc 보다은 pgcc 를 사용하는 것이 더 효율적 이에여 TCP/IP 대신 유닉스소켓을 사용하는 겨우에 통계에 의하면 7.5% 정도의 속도 향상 효과가 있다고 합니다 ^^;; (않해봐서 몰라여) 이외에 mysql 에서 메모리와 DNS 를 상용하는 방법에 대해 이해하고 있어야 하고 mysql 서버와 관련한 셋팅은 SET 명령을 이용하여 조절할 수 있으며 기타 서버와 관련한 셋팅은 심볼릭 링크, RAID 사용등과도 연관이 있습니다. ^^

다음 강좌에서은 직접 서버셋팅 튜닝에 대해 기술하겠습니다. ^^/  bye ~~

 

Press ESC to close