Archive

Posts Tagged ‘server’

리눅스서버 무엇을 선택할 것인가

June 10, 2009 1 comment

문제는 Windows가 싫어서, Mac이 싫어서 Linux를 설치하는 것이 아니고
LAPM(Linux, Apache, Php, Mysql)을 설치하고자할때 무엇을 선택할 것인가 하는 것이다.

레드햇 리눅스 / 페도라

우분투

무엇이 더 APM에 적당할지…
리눅스서버 구축/관리/운용 강좌 – Powered by : 수퍼유저코리아
“를 보면 RedHat 9를 설치했고,
리눅스 서버 구축“도 참조하고,
리눅스 우분투 9 APM(apache,php,mysql) 설치 및 설정하기 (컴파일용) : Linux Ubuntu“는 우분투이고…

무엇이 쉽고 어렵고 보다는 실제 서버회사에서는 어떤 리눅스를 까는지…

Tags: , ,

테이블을 빠르고 작게 배열하는 방법 (테이블 최적화)

August 8, 2008 Leave a comment
  • 가능한한 NOT NULL로 컬럼을 선언한다.
    속도가 빨라지며 각 컬럼마다 1 비트를 절약할 수 있다.
  • default 값을 가질 때 유리하다. 입력되는 값이 기본값과 다를 때만 확실하게 값이 입력된다.
    INSERT 문에서 첫번째 TIMESTAMP 컬럼이나 AUTO-INCREAMENT 컬럼의 값을 입력할 필요가 없다.[mysql_insert_id()] 참고.
  • 가능한한 테이블을 작게 만드려면 더 작은 integer 타입을 사용하자.
    예를 들면 MEDIUM INT 가 보통 INT 보다 좋다.
  • 가변 길이 컬럼이 없다면(VARCHAR, TEXT or BLOB columns), 고정 길이 레코드 포맷이 사용된다.
    이 경우 속도는 더 빠르지만 불행히도(흑흑~) 낭비되는 공간이 더 많다. [Row format] 참고.
  • mysql이 질의를 효과적으로 최적화하기 위해 많은 양의 데이터를 입력한후 isamchk –analyze를 실행하자.
    이렇게 하면 동일한 값을 가진 줄의 평균 숫자를 가리키는 각 인덱스의 값을 업데이트한다. (물론 unique 인덱스에서는 항상 1이다)
  • 인덱스와 인덱스에 따른 데이타를 정열하려면 isamchk –sort-index –sort-records=1 을 사용하자.
    인덱스에 따라 정렬된 모든 레코드를 읽기 위해 unique 인덱스를 가졌다면 이렇게 하는 것이 속도를 빠르게 하는 가장 좋은 방법이다.
  • INSERT 문에서 가능한 다중 값 목록을 사용하자.
    개별적인 SELECT 문보다 훨씬 빠르다. 데이타를 테이블에 입력할 때 LOAD DATA INFILE을 사용하자. 많은 INSERT 문을 사용하는 것보다 보통 20배 빠르다. [Load] 참고.
  • 많은 인덱스를 가진 테이블에 데이타를 입력할때 다음의 과정을 사용하면 속도를 향상시킬 수 있다.
    1. mysql이나 Perl 에서 CREATE TABLE로 테이블을 만든다.
    2. mysqladmin flush-tables 실행. (** 열린 테이블을 모두 닫음 **)
    3. isamchk –keys-used=0 /path/to/db/tbl_name 사용. 테이블에서 모든 인덱스 사용을 제거한다.
    4. LOAD DATA INFILE 를 이용 테이블에 데이타를 입력.
    5. pack_isam을 가지고 있고 테이블을 압축하기 원하면 pack_isam을 실행.
    6. isamchk -r -q /path/to/db/tbl_name 를 이용 인덱스를 다시 생성.
    7. mysqladmin flush-tables 실행.
  • LODA DATA INFILE 과 INSERT 문에서 더 빠른 속도를 내려면 키 버퍼를 증가시킨다.
    mysqld나 safe_mysqld에서 -O key_buffer=# 옵션을 사용하면 된다.
    예를 들어 16M는 풍부한 램을 가졌다면 훌륭한 값이다.
  • 다른 프로그램을 사용하여 데이타를 텍스트 파일로 덤프할때 SELECT … INTO OUTFILE을 사용하자.
  • 연속으로 다량의 insert와 update를 할 때 LOCK TABLE을 사용하여 테이블에 락을 걸면 속도를 향상시킬 수 있다.
    LOAD DATA INFILE 그리고 SELECT …INTO OUTFILE는 원자적이기 때문에 LOCK TABLE을 사용하면 안된다.

테이블이 얼마나 단편화되었는지 점검하려면 ‘.ISM’ 파일에서 isamchk -evi 를 실행한다.

Tags: , ,

테이블을 구성하는 3가지 포맷

August 8, 2008 Leave a comment

mysql은 세가지 다른 테이블 포맷 : 고정길이, 다이나믹, 압축.

  • 고정 길이 테이블(fixed row format)
    • varchar, text, blob을 사용하지 않을 때.
    • varchar로 지정해도 내부적으로 char로 처리
    • 가능하다면 가급적 고정포맷을 사용하는 것이 좋다.
    • 동적포맷보다 메모리사용이 적고, 인덱스파일크기도 작아진다. 당연히 속도 또한 향상된다.
    • 파일구조의 고정길이레코드가 고정포맷, 가변길이레코드가 동적포맷이라고 생각해주면 이해하기 쉬울 것이다.
    • 기본 포맷. 테이블에 VARCHAR, BLOB, TEXT 컬럼이 없을 때 사용.
    • 모든 CHAR, NUMERIC, DECIMAL 컬럼은 컬럼 길이에 space-padded 이다. (** space-padded를 무엇이라고 번역해야 할지 애매모호해서 **)
    • 매우 빠름
    • 캐쉬하기 쉽다
    • 손상 후 복구가 쉽다. 왜냐면 고정된 위이에 레코드가 위치하기 때문이다.
    • 많은 양의 레코드가 지워졌거나 운영 시스템에서 자유 공간을 늘리길 원치 않는다면 (isamchk를 이용) 재조직화할 필요없다.
    • 보통 다이나믹 테이블보다 많은 디스크 공간을 필요로 한다.
  • 다이나믹 테이블(dynamic row format)
    • varchar, text, blob을 사용할 때.
    • AVG_ROW_LENGTH(힌트 개념), MAX_ROW(크기 넘어가면 안됨)
    • varchar(3)보다 작다면 고정포맷이 사용됨 고정포맷에 비해 디스크사용에 있어 효율성을 가지나, 속도는 상대적으로 느리다.
    • 테이블에 빈번한 레코드의 수정/삭제가 이루어지면 단편화가 유발하므로 주기적인 optimize table이 요구된다.
    • text, blob은 별도로 저장되므로, optimize table을 수행할 필요성이 없다.
    • mysql 쿼리 최적화 : AVG_ROW_LENGTH, MAX_ROW로 10%정도의 성능향상 기대할수 있음.
    • 테이블이 VARCHAR, BLOB, TEXT 컬럼을 포함하고 있을 때 사용.
    • 모든 문자열 컬럼은 다이나믹하다.(4보다 작은 길이를 가진 문자열 제외)
    • 컬럼이 문자열 컬럼에서 비었거나 (”) 숫자형 컬럼에서 0(NULL 값을 가진 컬럼과 동일한 것이 아니다) 을 나타내는 비트맵이 모든 레코드 앞에 선행된다.
    • 문자열 컬럼에서 trailing space를 제거한 후 zero의 길이를 가지거나 숫자형 컬럼이 zero의 값을 가지면 비트 맵으로 표시되고 디스크에 저장되지 않는다.
    • 비지 않은 문자는 문자내용에 길이 바이트만큼 추가되어 저장된다.
    • 보통 고정 길이 테이블보다 디스크 공간 절약.
    • 줄의 길이를 확장하는 정보를 가지고 줄을 업데이트하면 줄은 단편화될 것이다.
    • 이런 경우 더 좋은 성능을 위해 때때로 isamchk -r 을 실행해야 한다.
    • 통계적으로(?) isamchk -ei tbl_name을 사용하자.
    • 손상후 복구가 어렵다. 왜냐면 레코드가 많은 조각드로 단편화되고 링크(단편)가 없어지기 때문이다.
  • 압축 테이블(compressed row format)
    • 읽기전용이다. myisampack 명령어로 만들 수 있다.
    • 디스크공간을 적게 차지하므로 CD에 백업할 때 사용하면 되겠다.
    • fixed나 dynamic을 압축해서 저장할수 있음. (read only)
    • 읽기 전용 테이블은 pack_isam 유틸리티로 만들 수 있다.
    • 확장 mysql 이메일 지원을 구입한 모든 고객은 내부적인 용도로 pack_isam을 사용할 권리가 주어진다.
    • 압축해제 코드는 모든 mysql 배포판에 있으므로 pack_isam이 없는 고객도 pack_isam으로 압축된 테이블을 읽을 수 있다. (테이블이 같은 플랫폼에서 압축되어 있는한)
    • 매우 적은 디스크 용량을 사용.
    • 각 레코드는 개별적으로 압축이 된다.
    • ( 매우 적은 액세스 overhead) 레코드의 헤더는 테이블의 가장 큰 레코드에 따라 (1-3 바이트) 고정된다.
    • 각 컬럼은 다르게 압축이 된다. 압축 타입은 다음과 같다:
      • 일반적으로 각 컬럼마다 다른 Huffman 테이블이다.
      • Suffic 공간 압축
      • Prefix 공간 압축
      • 0 값을 가진 숫자는 1비트로 저장.
      • integer 컬럼의 값이 작은 범위를 가졌다면, 컬럼은 최대한 작은 타입으로 저장된다.
      • 예를 들면 BIGINT 컬럼은 모든 값이 0부터 255라면 TINIINT 컬럼(1바이트)로 저장된다.
      • 컬럼이 몇가지 가능한 값으로만 구성되어 있다면, 컬럼 타입은 ENUM으로 변환된다.
      • 컬럼은 위 압축 방법을 조합하여 사용한다.
    • 고정 길이나 다이나믹 길이의 테이블을 다룰 수 있다. 그러나 BLOB나 TEXT 컬럼은 다룰 수 없다.
    • isamchk로 압축을 해재할 수 있다.
Tags: , ,