database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 16220 게시물 읽기
No. 16220
varchar 와 char의 속도차이를 알고 싶습니다.
작성자
Liebe
작성일
2002-06-11 17:45
조회수
5,403

varchar은 크기가 유동적이고 사용한 만큼만 용량을 사용하고

 

char은 데이타가 적게 들어있다고 하더라고 설정된 용량을 다 사용한다고

 

알고 있습니다.

 

그렇다면 속도차이가 얼마나 나고 char을 사용하는 이유가 속도문제가 아닌

 

다른 이유가 있는지 알고 싶습니다.

 

고수님들의 많은 리플 기다리겠습니다 (__)

이 글에 대한 댓글이 총 4건 있습니다.

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에서는 내부적으로 어느 정도 성능과 효율을 고려하여 자동변환되므로 크게 민감하실 필요는 없습니다.

김주현님이 2002-06-11 22:29에 작성한 댓글입니다.

우리의 일상 생활에는 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를 쓰는 경우도 있겠지만, 저는 잘 모르겠군요. ^^

 

그럼 이만

허정수(wertyu)님이 2002-06-11 22:32에 작성한 댓글입니다.

에구 ...

 

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 (

one int primary key,

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 를 찾아내는데 훨씬

빠릅니다.

김주현님이 2002-06-13 00:00에 작성한 댓글입니다.

감사합니다...

 

많은 도움 되었습니다

 

좋은 하루 되세요~

Liebe님이 2002-06-19 13:51에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
16223[요청]주말마다 서울 근교에서 스터디 모임하는 곳 없나요
김상태
2002-06-12
399
16230┕>자유게시판에 쓰는게 더 맞을듯하네요
문태준
2002-06-12 12:46:15
428
16222버벅이는 MySQL... 무엇이 문제일까요 [4]
Senon
2002-06-12
1717
16221php소스 문의 [1]
김주열
2002-06-11
432
16220varchar 와 char의 속도차이를 알고 싶습니다. [4]
Liebe
2002-06-11
5403
16219공백을 가져올때 어떻게 해야 [3]
이상훈
2002-06-11
1008
16217gdbm을 c언어를 사용해 mysql로변경 [1]
연희
2002-06-11
686
16216오늘의 날짜를 알고싶습니다... [2]
지나가는이
2002-06-11
519
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2021 DSN, All rights reserved.
작업시간: 0.010초, 이곳 서비스는
	PostgreSQL v13.1으로 자료를 관리합니다