메뉴 건너뛰기

라이온하트 2nd edition

홈페이지를 새롭게 리뉴얼합니다.

조회 수 73581 추천 수 0 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

mysql 에서 CHAR, VARCHAR 타입은 유사하다.

단지 저장하고 읽을 때만 살짝 다르다.


CHAR(40) 에 "mydata" 를 저장할 때, 6바이트를 저장하고 나머지 34바이트의 비어 있는 공간에는 공백을 채워서 저장한다.

그리고 읽어들일 때, 임의로 채워진 공백들은 제거되어서 읽혀진다. (물론, PAD_CHAR_TO_FULL_LENGTH 모드를 활성화하면 공백까지 다 읽어온다)


VARCHAR(40) 에 "mydata" 를 저장할 때, 6바이트를 저장하고, 뒤에 1바이트(255길이 미만) 또는 2바이트(255길이 이상)의 길이 정보를 추가한다.

따라서 VARCHAR 에는 공백을 채워넣지 않으므로, 가변 길이의 정보에 적합하다.

문제는 VARCHAR(40) 에 새로운 데이터가 업데이트 될 경우이다. 더 큰 길이의 데이터가 저장되면, 공간이 부족하여 새로운 저장 영역에 새로 할당해야 하기 때문이다. 이 때문에, 데이터 파편화가 심해진다.


테이블 ROW 중에 CHAR, VARCHAR 타입이 섞여 있으면 데이터 파편화는 발생할 수 밖에 없다. 파편화를 염두하고 설계한다면, 테이블의 데이터 타입 중에 VARCHAR 타입을 두어선 안될 것이다.

그러나 MySQL 에서는 다음의 쿼리를 적용하면 파편화를 막을 수 있다. 

 ALTER TABLE tblname ROW_FORMAT = FIXED;

VARCHAR 타입을 CHAR 타입처럼 동작하도록 강제로 지정하는 것이다. 덕분에 저장 용량은 증가하지만, VARCHAR 로 인한 파편화로 성능 저하는 막을 수 있다.


물론 VARCHAR 로 선언한다고 무조건 파편화가 발생하는 것은 아니다. 앞서서 적은대로, 처음에 데이터를 INSERT 한 뒤에, 다른 크기의 데이터로 UPDATE 가 발생할 경우에 파편화가 발생하는 것이다.

그러므로 LOG 테이블처럼 INSERT 만 허용되는 테이블에는 이 문제가 적용되지 않을 것이다.


그리고, 다음의 쿼리를 통해서 저장된 데이터를 분석해볼 수도 있다.

 SELECT * FROM tblname PROCEDURE ANALYSE();


마지막으로, 테이블 설계할 때부터 데이터 타입은 신중하게 고려하면 좋다. IPv4 문자열 주소는 CHAR(15) 형태로 한다든가, 아니면 아예 INT 값으로 저장할 수도 있다.(IPv6 라면 CHAR(39) 이다.)

그리고 MD5 암호키 정보는 CHAR(32) 형태로 하는 것이다.



http://netmaid.tistory.com/44

  • ?
    LionHeart 2014.08.28 21:30
    스크랩한 원문이 그런 것 같은데, 파편화라는 표현보다는 단편화(fragmentation)이라고 표현하는 것 같다. 좋은 정보네. 내용이 큰 경우(게시물의 contents)에는 varchar이나 text가 적합하지만 네가 운영하는 정도라면 CHAR이 효율적인 것은 사실이다. 큰 용량증가로 이어지지 않는다면 CHAR이 속도 면에서 유리하지.
  • ?
    badung007 2014.08.28 21:34
    차이가 많이 날지는 모르겟네욤 ㅎ
  • ?
    LionHeart 2014.08.28 22:13
    ㅎㅎㅎ 차이 많이 안 날거다. ㅎㅎ 저게 대용량 설계할 때나 저런거지

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
85 Computer AjaxPlorer 4.2.0 매뉴얼 [한글관련 설정] LionHeart 2014.10.02 134584
84 OS apache, cBand module LionHeart 2014.10.01 113459
83 OS Apache, DDoS 방어모듈 1 LionHeart 2014.10.01 169882
82 Information MONSTA web FTP LionHeart 2014.10.01 134903
81 Information 404 NOT FOUND file LionHeart 2014.09.30 70526
80 OS Windows 8.1 administrator 계정 활성화 명령어 LionHeart 2014.09.25 150876
79 Android [ 유니티3D엔진 ] 유니티 4.3.4 -> 4.2.2 다운그레이드 badung007 2014.09.20 80158
78 OS Doly의 CentOS7 강좌16 6. CentOS 네트워크 1 - 개념, 2 - 이더넷 설정 LionHeart 2014.09.11 100171
77 OS CentOS 6.5 네트워크 설정 완전 초기화 LionHeart 2014.09.06 134075
76 OS vsftpd 접속할때 500 OOPS : child died 에러날때 LionHeart 2014.09.06 71706
75 OS DHCP 서버와 IP 마스크레이드 1 LionHeart 2014.09.01 123775
74 OS [SQL] mysql 에서 bigint(20), int(11) 의 의미 badung007 2014.08.28 87042
» OS [SQL] mysql 에서 CHAR(40) 와 VARCHAR(40) 의 성능 차이 3 badung007 2014.08.28 73581
72 OS bind 9 리눅스 네임서버 설정방법 LionHeart 2014.08.27 89187
71 OS SULinux 2.0 웹서버(Apache) 설정 및 운영 LionHeart 2014.08.26 154477
70 OS 리눅스 - 아파치 2.x 트래픽 제한 LionHeart 2014.08.26 225188
69 IOS [ 유니티3D엔진 ] Object serializing in Unity on iOS devices. badung007 2014.08.26 65944
68 IOS [ 유니티3D엔진 ] XML Serialize Encrypt/Decrypt. badung007 2014.08.26 85581
67 IOS [ 유니티3D엔진 ] 유니티의 iOS 빌드는 왜 다른가? badung007 2014.08.26 74533
66 OS CentOS USB install (USB로 CentOS 설치하기) LionHeart 2014.08.22 111896
Board Pagination ‹ Prev 1 ... 3 4 5 6 7 8 9 10 11 12 Next ›
/ 12