varchar은 크기가 유동적이고 사용한 만큼만 용량을 사용하고
char은 데이타가 적게 들어있다고 하더라고 설정된 용량을 다 사용한다고
알고 있습니다.
그렇다면 속도차이가 얼마나 나고 char을 사용하는 이유가 속도문제가 아닌
다른 이유가 있는지 알고 싶습니다.
고수님들의 많은 리플 기다리겠습니다 (__)
char 는 고정 사이즈입니다. 남는 공간은 공백으로 채우게 됩니다.
예를 들어 char(10) 인데 'test'라는 4자짜리 문자열을 insert하게 되면 남는 공간은 6개의 공백으로 채우게 됩니다.
따라서 무조건 처음 선언된 10byte가 소요됩니다.
물론 값을 받아 올 때 이 공백은 자동으로 제거됩니다.
varchar는 이름이 의미하듯 가변길이입니다.
값을 insert하면 data값외에 삽입된 문자열의 길이를 저장하는데 1byte가 소요됩니다. 즉, 값외에 길이 정보도 같이 저장됩니다. 위의 예와 같이 'test'라는 4자짜리 문자열을 삽입하면
4byte + 길이를 저장하기 위한 1byte = 5byte가 소모됩니다.
char형의 경우 고정길이이므로 설령 삽입되는 데이타가 선언된 길이보다 작더라도 남는 공간은 스페이스로 채워지므로 공간의 낭비가 발생할 수 있습니다. 따라서 반드시 고정길이에 해당하는 데이타만 char로 선언하시는 것이 좋습니다.
MySQL의 경우 재미있는 기능이 있습니다.
저는 처음에 버그인줄 알았습니다. :-)
무엇인고하니.
테이블 생성시 명시적으로 아래와 같이 선언하였다고 하더라도.
4자 이하의 varchar 는 char로 자동 변환됩니다.
만약 테이블안에 varchar나 text, blob 같은 가변길이 데이타가 하나라도 있을 경우 3자 이상의 char 컬럼이 자동으로 varchar로 바뀝니다.
이 기능은 직접해보시면 됩니다. create table해보시고
실재로 무슨 형으로 변환되었는지는 desc table_name으로 확인하시면 됩니다.
이렇게 하는 이유는 물론 성능과 속도 때문이죠.
제가 알기론 타 DBMS는 이런식의 자동변환이 없습니다.
따라서 MySQL에서는 내부적으로 어느 정도 성능과 효율을 고려하여 자동변환되므로 크게 민감하실 필요는 없습니다.
우리의 일상 생활에는 Trade-off(일장일단)이 있는 경우가 많습니다.
CHAR와 VARCHAR도 Trade-off가 있죠.
MySQL에서는 테이블의 필드 길이에 따라서,
Fixed size Table과 Variable Size Table이라고 구분을 합니다.
VARCHAR 등의 가변적인 길이를 가지는 컬럼이 없는 테이블을 Fixed size table이라고 하고, 속도가 빠릅니다.
자세한 것은
http://www.mysql.com/doc/S/t/Static_format.html
를 보시길...
>> char을 사용하는 이유가 속도문제가 아닌
저의 경우에는 속도 문제로 VARCHAR 대신 CHAR를 씁니다. 다른 이유로 CHAR를 쓰는 경우도 있겠지만, 저는 잘 모르겠군요. ^^
그럼 이만
에구 ...
char vs. varchar 즉 fixed table vs. dynamic table의 속도차이를 테스트해봤습니다.
아래와 같이 2개의 테이블을 만들고 perl로 10만건의 자료를
insert 한 후 select 속도를 비교했습니다.
create table variable (
one int primary key,
two varchar(10),
three varchar(30) );
create table fixed (
two char(10),
three char(30) );
select는 table full scan
"select * from variable"
"select * from fixed"
2개의 쿼리를 사용했습니다.
char를 사용했을 경우에는 0.54 sec가 걸렸으며
varchar를 사용했을 경우에는 0.64 sec 가 걸렸습니다.
즉, fixed type table (고정길이 테이블)을 사용할 경우
0.1 sec가 더 빨랐습니다.
겨우 0.1초라고 생각할 수도 있으나 동시에 100개의 접속이
들어올 경우를 가정한다면 무시할 수 없는 속도차이입니다.
varchar형의 경우 일일이 그 길이를 계산하여야 다음 로우를 얻을 수 있는 반면에 char형의 경우는 항상 고정된 row사이즈를 가지고 있으므로 얻고자하는 row 를 찾아내는데 훨씬
빠릅니다.
감사합니다...
많은 도움 되었습니다
좋은 하루 되세요~