[SQL] MySQL의 테이블에 VARCHAR 길이의 중요성
SQLMySQL의 테이블에 VARCHAR 길이의 중요성
나는 행이 동적으로 삽입되는 MySQL의 테이블이 있습니다. 내가 문자열의 길이를 특정하고 할 수 없기 때문에 나는 일반적으로 내가 필요로하는 것보다 훨씬 더 큰 그들 VARCHAR (200)를 만들어, 그들을 차단하지. 필요보다 VARCHAR 필드에게 더 많은 길이를주는 큰 성능 저하가 있습니까?
해결법
-
==============================
1.해당 컬럼에 저장하고있는 값이 항상있는 경우 아니, 의미에서 VARCHAR (50) 또는 VARCHAR (200)과 동일한 성능을 가지고로 열을 선언, 50 자 미만 (말) 있음.
해당 컬럼에 저장하고있는 값이 항상있는 경우 아니, 의미에서 VARCHAR (50) 또는 VARCHAR (200)과 동일한 성능을 가지고로 열을 선언, 50 자 미만 (말) 있음.
-
==============================
2.하나의 가능한 성능에 미치는 영향이있다 : MySQL의에서, 임시 테이블 및 MEMORY 테이블이 최대 길이에게 패딩, 고정 길이 컬럼으로 VARCHAR 열을 저장합니다. 당신이 필요로하는 가장 큰 크기보다 훨씬 더 큰 VARCHAR 컬럼을 설계하는 경우에하는 것보다, 당신은 더 많은 메모리를 소모합니다. 이 캐시 효율성, 정렬 속도 등에 영향을 미치는
하나의 가능한 성능에 미치는 영향이있다 : MySQL의에서, 임시 테이블 및 MEMORY 테이블이 최대 길이에게 패딩, 고정 길이 컬럼으로 VARCHAR 열을 저장합니다. 당신이 필요로하는 가장 큰 크기보다 훨씬 더 큰 VARCHAR 컬럼을 설계하는 경우에하는 것보다, 당신은 더 많은 메모리를 소모합니다. 이 캐시 효율성, 정렬 속도 등에 영향을 미치는
-
==============================
3.200 자 할 것입니다 귀하의 예에 따라 한계,하지만 아무것도 덜 접수 및 컬럼의 할당 크기를 기입하지 않습니다 - 그것은 "변수 문자"를 의미하기 때문에 VARCHAR, 당신이 설명하는 상황에 이상적입니다.
200 자 할 것입니다 귀하의 예에 따라 한계,하지만 아무것도 덜 접수 및 컬럼의 할당 크기를 기입하지 않습니다 - 그것은 "변수 문자"를 의미하기 때문에 VARCHAR, 당신이 설명하는 상황에 이상적입니다.
VARCHAR도 적은 공간을 차지 - 숫자는 1 바이트 또는 2 바이트 길이의 프리픽스 플러스 데이터로서 저장된다. 길이 프리픽스 값의 바이트 수를 나타낸다. 값 255 바이트를 요구할 수있는 경우의 값은 더 이상 255 바이트를 필요로하는 경우 열이 하나 개의 길이 바이트를 사용하여, 두 개의 길이 (바이트).
VARCHAR 데이터 유형에 MySQL은 CHAR 비교 자세한 내용은이 링크를 참조하십시오.
-
==============================
4.크기는 성능입니다! 더 나은, 크기가 작을수록. 오늘은 나 내일,하지만 심각한 병목 현상에 올 때 테이블이 크기로 성장한다 언젠가 당신을 설계 상관없이 뻗어. 그러나 먼저 발생하고 수평으로 더 많은 서버를 추가하여 구조 나 규모를 다시 생각해야 할 때까지 데시벨 빠르고 즐겁게 수행 할 시간을 확장하려고 할 가능성이 설계 단계에서 그 잠재적 인 병목 현상의 일부를 예견 할 수 있습니다.
크기는 성능입니다! 더 나은, 크기가 작을수록. 오늘은 나 내일,하지만 심각한 병목 현상에 올 때 테이블이 크기로 성장한다 언젠가 당신을 설계 상관없이 뻗어. 그러나 먼저 발생하고 수평으로 더 많은 서버를 추가하여 구조 나 규모를 다시 생각해야 할 때까지 데시벨 빠르고 즐겁게 수행 할 시간을 확장하려고 할 가능성이 설계 단계에서 그 잠재적 인 병목 현상의 일부를 예견 할 수 있습니다.
귀하의 경우에는 당신이로 실행할 수있는 많은 성능 누출이 있습니다 빅 긴 VARCHAR 컬럼에있는 거의 불가능 합류했다. 그 컬럼에 색인 진짜 살인자입니다. 디스크는 데이터를 저장한다. 한 개의 메모리 페이지는 적은 행을 저장할 수 및 테이블 스캔이 훨씬 느립니다. 또한, 쿼리 캐시는 여기에 당신을 도울 않을 것입니다.
얼마나 많은 삽입 연간 발생할 수 있습니다 : 당신은 스스로에게 물어해야? 평균 길이는 무엇인가? 정말 200 개 이상의 문자를 필요하거나 심지어 최대 길이에 대해 사용자에게 알림으로써, 내 응용 프로그램의 프런트 엔드에 그것을 잡을 수 있습니까? 나는 크기를 확장 추가, 자주 필요한 데이터를 보유하기위한 빠른 인덱싱 및 검색 및 다른 하나 좁은 하나에 테이블을 분할 할 수 있습니까? 나는 범주로 가능한 VARCHAR 데이터를 입력하고 그래서 몇 작고, 어쩌면 int 형 또는 부울 형 컬럼에 데이터의 일부를 추출하고 varchar 열 방식 것으로 범위를 좁힐 수 있습니까?
당신은 여기에서 많은 작업을 수행 할 수 있습니다. 그것은 실제 측정 된 성능 데이터를 사용하여 다음 단계로 재 설계 단계를 첫 번째 가정에 가서하는 것이 가장 수 있습니다. 행운을 빕니다.
-
==============================
5.공연? 제 디스크 스토리지? 네, 저렴하고 풍부한입니다 만. 데이터베이스가 테라 바이트 규모로 성장할 것입니다하지 않는 한 당신은 아마 괜찮아.
공연? 제 디스크 스토리지? 네, 저렴하고 풍부한입니다 만. 데이터베이스가 테라 바이트 규모로 성장할 것입니다하지 않는 한 당신은 아마 괜찮아.
-
==============================
6.여러분 중 일부는 VARCHAR (200)은 VARCHAR (20)에 비해 디스크에 더 테이블의 크기를 차지한다는 잘못된 생각이다. 그렇지 않다. 255 개 문자 이상으로 갈 때 만 VARCHAR 필드 데이터의 길이를 결정하기 위해 추가 바이트를 사용 MYSQL 않습니다.
여러분 중 일부는 VARCHAR (200)은 VARCHAR (20)에 비해 디스크에 더 테이블의 크기를 차지한다는 잘못된 생각이다. 그렇지 않다. 255 개 문자 이상으로 갈 때 만 VARCHAR 필드 데이터의 길이를 결정하기 위해 추가 바이트를 사용 MYSQL 않습니다.
-
==============================
7.그러나 일반적으로하지 대부분의 사용자가 알 것이라고 수준에서 - 성능 히트있을 수 있습니다.
그러나 일반적으로하지 대부분의 사용자가 알 것이라고 수준에서 - 성능 히트있을 수 있습니다.
각 필드의 크기를 미리 알 때, MySQL은 모든 데이터를 읽지 않고 각 필드 / 행 및 전달할 수 있습니다 페이지 사이에 정확히 얼마나 많은 바이트 알고있다. 변수 문자를 사용하면 최적화를 위해이 기능을 diminshes.
성능 VARCHAR 결과는 데이터 단편화로 인해 공격합니까?
더 좋은 VARCHAR 대 숯불.
대부분의 용도를 위해, 당신도에 괜찮을거야 -하지만 차이가있다, 대규모 데이터베이스의 경우, 당신은 하나 또는 다른 선택 줄 이유가있다.
-
==============================
8.오히려 그냥 문자보다 VARCHAR이기 때문에, 크기는 실제 길이와 문자열 자체를 나타 내기 위해 내부 필드를 기반으로합니다. VARCHAR (150)를 사용하여 매우 다르지 않다 VARCHAR (200)를 사용하여 그래서, 당신은 저장소에있는 잠재력을 가지고 것을 제외 더.
오히려 그냥 문자보다 VARCHAR이기 때문에, 크기는 실제 길이와 문자열 자체를 나타 내기 위해 내부 필드를 기반으로합니다. VARCHAR (150)를 사용하여 매우 다르지 않다 VARCHAR (200)를 사용하여 그래서, 당신은 저장소에있는 잠재력을 가지고 것을 제외 더.
그리고 당신은 행이 증가하는 경우, 갱신에 무슨 고려해야한다. 이것은 드문 경우에, 당신은 괜찮을 것이다.
-
==============================
9.데이터 유형 이름에 따라 나의 지식에 따라 어떠한 성능 저하가 없다,이 VARCHAR 즉 변수 문자 데이터 저장, MySQL의 엔진 자체는 저장된 데이터에 따라 사용되는 메모리를 할당입니다 제안합니다.
데이터 유형 이름에 따라 나의 지식에 따라 어떠한 성능 저하가 없다,이 VARCHAR 즉 변수 문자 데이터 저장, MySQL의 엔진 자체는 저장된 데이터에 따라 사용되는 메모리를 할당입니다 제안합니다.
-
==============================
10.당신은 당신 같은 VARCHAR 컬럼에 동일한을 보려고해야 할 것이다 숯불 대부분의 시나리오에서 열 및 보수적 길이를 설정합니다. 당신은 항상 영향 당신의 결정이 최대 길이를 만드는 것을 무언가로 수정 훨씬 VAR 생각할 필요가 없습니다. 그것은 정말 제공되는 문자열은 다양한 길이 될 것입니다 대신하는 성능을 힌트로 간주되어야한다.
당신은 당신 같은 VARCHAR 컬럼에 동일한을 보려고해야 할 것이다 숯불 대부분의 시나리오에서 열 및 보수적 길이를 설정합니다. 당신은 항상 영향 당신의 결정이 최대 길이를 만드는 것을 무언가로 수정 훨씬 VAR 생각할 필요가 없습니다. 그것은 정말 제공되는 문자열은 다양한 길이 될 것입니다 대신하는 성능을 힌트로 간주되어야한다.
그것은 엄격 데이터베이스 내부에서 따라야하는 지시문이 아니다, 그것은 완전히 무시할 수 있습니다. 심지어는 이상적인 세계에서 안하지만 누출 (예를 들어 고정 길이와 패딩) 수있는이 그러나 때로는 구현 알아서 마십시오.
당신은 VARCHAR (255)가있는 경우 당신은 성능이 현명한 항상 다른 모든 상황에서 CHAR (255)로 어떤 행동 것된다는 보장이 없습니다.
그것은 스토리지 요구 사항에 대한 설명서에 기재 조언 뭔가 같은 255, 65535 등 인라인에 그것을 설정 쉽게 보일 수있다. 이 0 (예, 그것의 일)과 255 사이의 값이 같은 영향을 미칠 것이라는 인상을 준다. 그러나이 완전히 보장 할 수있는 일이 아니다.
스토리지 요구 사항은 true 또는 괜찮은위한 좋은 지표가 될 경향이 행 보관의 측면에서 지속적인 스토리지 엔진을 성숙 않습니다. 여기에는 인덱스와 같은 것들에 대한 강력한 지표로하지 않습니다.
그것은 정확히 얼마나 긴 문자열의 일부가 그럴 최고 당신이 이내 일 것 알고 바인딩하지만 그 영향을주지 않습니다로 설정해야 때때로 어려운 질문입니다. 불행하게도 이것은 종종 해결하기 위해 사용자 왼쪽 일이며 정말 다소 임의적이다. 당신은 정말 문자열을 특대 결코 말할 수 없다 정확하게 확실하지가 어쩌면 경우 때문이다.
당신은 오류 배출량에서 너무 짧은있을 경우 즉, 적어도 당신이 알 수 있도록 문자열 잘라 내기보다 너무 오래 오히려 때 MySQL의 쿼리 오류가 발생 있는지 확인해야합니다. 확대하거나 고가의 DDL 작업을 할 수 있습니다를 축소 할 열 크기 조정이 염두에 보관해야합니다.
길이와 성능이 놀이로 오는 곳 문자 세트도 고려되어야한다. 길이는이 아닌 바이트를 의미합니다. 예 UTF8 (되지 MB4)를 사용한다면 VARCHAR (255) (255 * 3) 실제로 VARBINARY이다. 그것은이 같은 일이 정말 테스트를 실행하고 소스 코드 / 문서에 깊게보고없이 재생됩니다 방법을 알고 어렵다. 이 때문에 과도한 길이가 예기치 않게 비정상적으로 영향을 미칠 여지가있다. 이것은 단지 성능에 적용되지 않습니다. 더 큰 하나에 VARCHAR 컬럼의 문자 집합을 변경하려면 하루 필요 당신은 당신이 무상으로 긴 문자열은 피할 수있을 수 있다면 어떤 의지와 함께 몇 가지 한계를 때리는 끝낼 수 있습니다합니다. 이것은 일반적으로 상당히 틈새 문제가 있지만, 그것은 최근에 MySQL과 키 길이에 제한이 인덱스 utf8mb4의 도입으로 중요한 문제이고, 올 않습니다.
이 MAX (길이 (열)) 항상 밝혀 경우 (이 열 정의와 일치하지 않은 입력에 제한이있을 것입니다 결정했다 경우 등)하지만 당신은 VARCHAR (255)가 <64 다음이있다 당신은 몇 가지 시나리오에 필요한보다 4 배 더 많은 공간을 사용하게 될 것을 좋은 기회.
이 포함될 수 있습니다 :
그것은, 어쨌든 할 필요가 성능 문제 여부 나는 그 때 당신이 할 수에 집착하는 것이 좋습니다 있도록보다 엄지 손가락의 규칙 같이 VARCHAR가 더 길어위한 아무 필요가 전혀 없습니다. , 데이터의 크기를 샘플링 진정한 제한을 강화 또는 요청을 통해 진정한 제한을 찾기 위해 더 많은 노력을 촬영 / 연구는 이상적인 방법입니다.
때 당신이 할 수없는, 당신은 의심 그때 과학을 수행하는 것이 좋습니다 때 경우에 같은 VARCHAR (255)로 무언가를하고 싶은 경우. 이것은 또한뿐만 아니라 지수 (/ 행 데이터를 테이블을 복제 한 후 원본과 그것으로 데이터를 복사 및 인덱스의 크기로보고 var에 문자 컬럼의 크기를 줄이는 열을 구성 기본 키로을 시도 할 수있는 행이 기본 키에 의해 정렬로) 이노에서 다르게 작동 할 수 있습니다. 당신이 가장 민감한 병목 현상 중 하나가 될 경향이 IO에 영향을 미칠 경우 적어도이 방법에서 당신은 알 수 있습니다. 메모리 사용에 대한 테스트하는 것이 더 어렵다, 그 철저하게 테스트 어렵다. 나는 (메모리 결과 중간의 많은 쿼리 등 대형 임시 테이블에 대한 설명과 함께 확인) 잠재적 인 최악의 경우 테스트를 추천 할 것입니다.
당신이 테이블에 많은 행이있을 않을거야 알고 있다면, 당신은 등을 위해 조인 열 (특히, 복합 고유) 인덱스를 사용하지 않을 당신은 많은 문제를 대부분 습관이있다.
from https://stackoverflow.com/questions/1962310/importance-of-varchar-length-in-mysql-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL : 대 BETWEEN <= 및> = (0) | 2020.04.06 |
---|---|
[SQL] VARCHAR 대 SQL SELECT 속도 INT (0) | 2020.04.06 |
[SQL] 바로 조인 내부 조인 또는 어떻게하는 편에있는 테이블을 결정하기 위해 왼쪽 / 조인 사용할 때 어떻게 결정합니까? (0) | 2020.04.06 |
[SQL] 동적으로 열 SQL을 생성 (0) | 2020.04.06 |
[SQL] SQLite는 - 어떻게 다른 데이터베이스에서 테이블을 조인합니까? (0) | 2020.04.06 |