MySQL : 큰 VARCHAR 대 TEXT?
사용자 간의 메시지를 기록하는 MySQL의 메시지 테이블이 있습니다. 일반적인 ID 및 메시지 유형 (모든 정수 유형) 외에도 실제 메시지 텍스트를 VARCHAR 또는 TEXT로 저장해야합니다. 나는 메시지가 이보다 오래 db에 삽입되지 않음을 의미하는 3000 자의 프런트 엔드 제한을 설정하고 있습니다.
VARCHAR (3000) 또는 TEXT를 사용하는 이유가 있습니까? VARCHAR (3000)을 작성하는 것에 대해 다소 반 직관적 인 느낌이 있습니다. Stack Overflow에 대한 다른 유사한 게시물을 살펴 봤지만 이러한 유형의 일반적인 메시지 저장에 대한 특정보기를 얻는 것이 좋을 것입니다.
TEXT
및BLOB
테이블은 단지 실제 저장 영역의 위치에 대한 포인터를 갖는 테이블 떨어져 저장된다.VARCHAR
테이블과 함께 인라인으로 저장됩니다.VARCHAR
크기가 합리적 일 때 속도가 더 빠르며, 트레이드 오프는 데이터와 하드웨어에 따라 달라집니다. 데이터로 실제 시나리오를 벤치마킹하고 싶을 것입니다.
업데이트VARCHAR
또는 TEXT
저장 여부 는 데이터 크기, 열 크기, row_format 및 MySQL 버전에 따라 다릅니다. "text"대 "varchar"에 의존 하지 않습니다 .
사용자 입력이 얼마나 오래 걸릴지 예측할 수 있습니까?
VARCHAR (X)
사례 : 사용자 이름, 이메일, 국가, 제목, 비밀번호
본문
사례 : 메시지, 이메일, 댓글, 서식있는 텍스트, html, 코드, 이미지, 링크
MEDIUMTEXT
케이스 : 큰 json 본문, 짧은 책에서 중간 길이의 책, csv 문자열
LONGTEXT
사례 : 교과서, 프로그램, 수년간의 로그 파일, 해리 포터와 불의 잔, 과학 연구 로깅
모범 사례를 명확히하기 위해 :
텍스트 형식 메시지는 거의 항상 TEXT로 저장되어야합니다 (임의의 길이가 됨).
문자열 속성은 VARCHAR (대상 사용자 이름, 제목 등)로 저장되어야합니다.
프런트 엔드 제한이 있음을 이해합니다. 그렇지 않을 때까지 좋습니다. * grin * 비결은 DB를 연결하는 응용 프로그램과 별개로 생각하는 것입니다. 한 응용 프로그램이 데이터에 제한을 두었다고해서 데이터가 본질적으로 제한된다는 의미는 아닙니다.
메시지 자체가 3000자를 넘지 않도록 강제하는 것은 무엇입니까? 임의의 응용 프로그램 제약 인 경우 (예 : 텍스트 상자 또는 기타) TEXT
데이터 레이어 의 필드를 사용합니다 .
면책 조항 : 저는 MySQL 전문가는 아니지만 문제에 대한 이해입니다.
TEXT는 mysql 행 외부에 저장되어 있고 VARCHAR은 행의 일부로 저장되어 있다고 생각합니다. mysql 행에 대한 최대 행 길이가 있습니다. .. VARCHAR를 사용하여 행에 저장할 수있는 다른 데이터의 양을 제한 할 수 있습니다.
또한 행의 일부를 형성하는 VARCHAR로 인해 해당 필드를 보는 쿼리가 TEXT 청크를 사용하는 쿼리보다 약간 빠르다고 생각합니다.
짧은 대답 : 실용성, 성능 또는 저장 용량 차이가 없습니다.
긴 대답 :
본질적으로 (MySQL에서는) VARCHAR(3000)
(또는 다른 큰 제한)과 TEXT
. 전자는 3000 자 에서 잘립니다 . 후자는 65535 바이트 에서 잘립니다 . ( 문자가 여러 바이트를 취할 수 있기 때문에 바이트 와 문자를 구분 합니다.)
에서 더 작은 제한의 VARCHAR
경우 TEXT
.
- "작게"는 버전, 컨텍스트 및에 따라 191, 255, 512, 767 또는 3072 등을 의미
CHARACTER SET
합니다. INDEXes
열을 인덱싱 할 수있는 크기가 제한됩니다. (767 또는 3072 바이트 , 버전 및 설정에 따라 다름)- 컴플렉스
SELECTs
에 의해 생성 된 중간 테이블 은 MEMORY (빠름) 또는 MyISAM (느림)의 두 가지 방식으로 처리됩니다. '대형'열이 관련되면 더 느린 기술이 자동으로 선택됩니다. (버전 8.0에서 중요한 변경 사항이 있으므로이 글 머리 기호 항목은 변경 될 수 있습니다.) - 이전 항목과 관련하여 모든
TEXT
데이터 유형 (반대VARCHAR
)은 MyISAM으로 바로 이동합니다. 즉,TINYTEXT
생성 된 임시 테이블의 경우 동등한VARCHAR
. (그러나 이것은 토론을 세 번째 방향으로 가져갑니다!) VARBINARY
같다VARCHAR
;BLOB
입니다TEXT
.
다른 답변에 대한 반박
원래 질문은 한 가지를 물었습니다 (사용할 데이터 유형). 받아 들여진 대답은 다른 것 (비 기록 저장)에 응답했습니다. 그 대답은 이제 구식입니다.
이 스레드가 시작 되고 응답 되었을 때 InnoDB에는 두 개의 "행 형식"만있었습니다. 얼마 지나지 않아 두 가지 형식 ( DYNAMIC
및 COMPRESSES
)이 더 도입되었습니다.
TEXT
및 의 저장 위치 는 데이터 유형의 이름이 아니라 크기를VARCHAR()
기반으로 합니다 . 큰 텍스트 / Blob 열의 온 / 오프 레코드 저장에 대한 업데이트 된 설명은 이를 참조 하십시오 .
앞의 답변은 주요 문제에 대해 충분히 주장하지 않습니다.
(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id)
임시 테이블이 필요할 수 있으며 VARCHAR
필드가 포함 CHAR
된 경우 임시 테이블 의 필드 로 변환됩니다 . 따라서 테이블에 VARCHAR(65000)
필드 가있는 500,000 줄이 있다고 말하면 이 열만 6.5 * 5 * 10 ^ 9 바이트를 사용합니다. 이러한 임시 테이블은 메모리에서 처리 할 수 없으며 디스크에 기록됩니다. 그 영향은 치명적일 것으로 예상 할 수 있습니다.
소스 (메트릭 포함) : https://nicj.net/mysql-text-vs-varchar-performance/ ( "standard"(?) MyISAM 스토리지 엔진에서 TEXT
vs 처리를 나타냅니다 VARCHAR
. 다른 항목에서는 다를 수 있습니다. 예 : InnoDB.)
Varchar는 이메일 주소와 같은 작은 데이터를위한 것이고 Text는 뉴스 기사와 같은 훨씬 더 큰 데이터를위한 것이고 이미지와 같은 바이너리 데이터를위한 Blob입니다.
The performance of Varchar is more powerful because it runs completely from memory, but this will not be the case if data is too big like varchar(4000)
for example.
Text, on the other hand, does not stick to memory and is affected by disk performance, but you can avoid that by separating text data in a separate table and apply a left join query to retrieve text data.
Blob is much slower so use it only if you don't have much data like 10000 images which will cost 10000 records.
Follow these tips for maximum speed and performance:
Use varchar for name, titles, emails
Use Text for large data
Separate text in different tables
Use Left Join queries on an ID such as a phone number
If you are going to use Blob apply the same tips as in Text
This will make queries cost milliseconds on tables with data >10 M and size up to 10GB guaranteed.
There is a HUGE difference between VARCHAR and TEXT. While VARCHAR fields can be indexed, TEXT fields cannot. VARCHAR type fields are stored inline while TEXT are stored offline, only pointers to TEXT data is actually stored in the records.
If you have to index your field for faster search, update or delete than go for VARCHAR, no matter how big. A VARCHAR(10000000) will never be the same as a TEXT field bacause these two data types are different in nature.
- If you use you field only for archiving
- you don't care about data speed retrival
- you care about speed but you will use the operator '%LIKE%' in your search query so indexing will not help much
- you can't predict a limit of the data length
than go for TEXT.
참고URL : https://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text
'Development Tip' 카테고리의 다른 글
setTimeout (fn, 0)이 때때로 유용한 이유는 무엇입니까? (0) | 2020.09.28 |
---|---|
기능 브랜치 리베이스 후 Git 푸시가 거부 됨 (0) | 2020.09.28 |
변수가 있는지 어떻게 확인합니까? (0) | 2020.09.28 |
Java에서 String을 InputStream으로 어떻게 변환합니까? (0) | 2020.09.28 |
Git에서 분기 토폴로지 시각화 (0) | 2020.09.28 |