복붙노트

[SQL] 모든 텍스트 기반의 필드에 대한 일반적인 VARCHAR (255)를 사용하여이 단점은?

SQL

모든 텍스트 기반의 필드에 대한 일반적인 VARCHAR (255)를 사용하여이 단점은?

나는이 분야의 누구도 255 개 문자를 가진 가까이 오지 않습니다에도 불구하고 VARCHAR (255)로 정의 모두 등등 우편 번호, 이름, 성, 도시, 국가, 전화 번호 등의 분야를 포함하는 접촉 테이블을 가지고 . (당신이 궁금해하는 경우 루비 레일에 마이그레이션이 기본적으로 VARCHAR (255)에 문자열 필드를 매핑 나는 결코 그것을 무시 귀찮게하지 않기 때문에,이 방법이다).

VARCHAR 만 (필드 길이와 함께) 필드의 실제 문자의 수를 저장하는 것이기 때문에, (255) VARCHAR 위에 말하자면, (16) VARCHAR를 사용하여 어떤 뚜렷한 장점 (그렇지 않으면 성능)이 있는가?

또한, 이러한 필드의 대부분은 그들에 인덱스를 가지고있다. 이 필드에서 큰 VARCHAR 크기는 전혀 크기 나 인덱스의 성능에 영향을 미칩니 까?

참고로 나는 MySQL의 5를 사용하고 있습니다.

해결법

  1. ==============================

    1.스토리지에서 VARCHAR (255)은 항상 255 개 문자를 저장하는 것입니다 CHAR (255)과는 달리 주어진 행에 필요한 유일한 길이를 저장하는 스마트 충분하다.

    스토리지에서 VARCHAR (255)은 항상 255 개 문자를 저장하는 것입니다 CHAR (255)과는 달리 주어진 행에 필요한 유일한 길이를 저장하는 스마트 충분하다.

    당신은 MySQL의이 질문에 태그 때문에, 나는 MySQL의 특정 팁을 언급합니다 : 행이 SQL 층에 스토리지 엔진 층에서 복사 한, VARCHAR 필드는 고정 폭 행 작업의 우위를 확보하기 위해 CHAR로 변환 . 메모리에있는 문자열은 당신의 선언 VARCHAR 컬럼의 최대 길이에게 채워 지도록.

    쿼리가 암시 적으로 임시 테이블을 생성 할 때 정렬 또는 GROUP BY 동안, 예를 들어,이 많은 메모리를 사용할 수 있습니다. 당신이 그렇게 오래있을 필요가없는 데이터에 대한 VARCHAR (255) 필드를 많이 사용하는 경우,이 임시 테이블이 매우 큰 수 있습니다.

    당신은 또한 같은 알아야 할 수 문자열도 단일 바이트 내용이 저장 문자열을 문자 당 3 바이트에 밖으로 UTF8 문자 집합 패드 (예를 들어, ASCII 또는 라틴 문자)로 선언 된 것을 행동 수단이 "밖으로 패딩". 그리고 마찬가지로 utf8mb4 문자 세트 메모리에 문자 당 4 바이트 패드 밖으로에 문자열을 발생합니다.

    포함 된 VARCHAR (255) UTF8에가 "아니오 의견"와 같은 짧은 문자열을 저장 그래서 11 디스크 바이트 (열 낮은 캐릭터 세트의 문자를 더한 길이 한 바이트) 필요하지만 메모리에 765 바이트 소요되며, 따라서 임시 테이블 또는 분류 결과.

    나는 무의식적으로 자주 1.5GB 임시 테이블을 생성하고 자신의 디스크 공간을 채워 MySQL의 사용자를 도왔다. 그들은 VARCHAR 많은 (255) 실제로 매우 짧은 문자열을 저장 열을했다.

    그것은 당신이 가게에 의도하는 데이터의 유형에 따라 열을 정의하는 것이 가장 좋습니다. 그것은 다른 사람이 언급 한 것처럼, 응용 프로그램 관련 제약 조건을 적용하는 장점이 있습니다. 그러나 내가 위에서 설명한 메모리 낭비를 방지하기 위해 물리적 인 장점이 있습니다.

    그것은 가장 긴 우편 주소는 많은 사람들이 확실히 더 이상 모든 주소보다 긴 VARCHAR를 선택하는 이유입니다 물론, 알고 어렵다. 이 길이가 하나의 바이트로 인코딩 될 수있는 해당하는 VARCHAR의 최대 길이가 255이기 때문에 관례이다. 또한 5.0보다 이전 버전의 MySQL의 최대 VARCHAR 길이였다.

  2. ==============================

    2."해서"ㄱ VARCHAR의 크기를 설정 (저장 등의 가능성이 더 중요하고 더 저렴 매초 얻는 처리)의 크기와 성능 고려 사항 외에도 VARCHAR (255)를 사용할 때의 단점은 데이터 무결성을 감소된다.

    "해서"ㄱ VARCHAR의 크기를 설정 (저장 등의 가능성이 더 중요하고 더 저렴 매초 얻는 처리)의 크기와 성능 고려 사항 외에도 VARCHAR (255)를 사용할 때의 단점은 데이터 무결성을 감소된다.

    문자열의 최대 한계를 정의하면 RDBMS를 입력하고 검색 할 때 나중에 버퍼 오버런 또는 예외 / 오류의 원인과 예상보다 오래 (자세한 바이트)입니다 데이터베이스에서 값을 구문 분석에서 예상 문자열보다 더 방지 할 수있는 좋은 일이다.

    당신이 국가 약어에 대한 두 개의 문자열을 받아들이는 필드가 예를 들어, 당신은 입력 전체 국가 이름에 (이 맥락에서, 프로그래머) 사용자를 기대할 생각할 이유가 없다. 당신이 그 (것)들을 "앤티가 바부 다"(AG) 또는 "허드 섬 및 맥도널드 제도"(HM)를 입력하지 않으 때문에, 당신은 데이터베이스 계층에서이를 허용하지 않습니다. 또한, 가능성이 일부 프로그래머들은 아직이 일을하지 알고 (반드시 존재하는) 설계 문서를 RTFMed하지 않은 것입니다.

    (오류와 함께 자신의 SQL을 거부하여 비정상적으로 절단 또는에 의해 정상적으로 중) 두 개의 문자를 받아 그와 RDBMS의 거래를하게하기 위해 필드를 설정합니다.

    특정 길이를 초과 할 이유가없는 실제 데이터의 예 :

    등등...

    데이터와 한계에 대해 생각하는 시간을 가지십시오. 당신이 아키텍트, 개발자, 또는 프로그래머 인 경우에, 당신의 임무는 모든 후입니다.

    포함 된 VARCHAR (n)이 대신 VARCHAR (255)를 사용함으로써 사용자 (최종 사용자, 프로그래머, 다른 프로그램) 나중에 코드를 다시 잡으러 올 것이다 예기치 않게 긴 데이터를 입력 문제를 제거 할 수 있습니다.

    그리고 당신은 또한 당신의 응용 프로그램에서 사용하는 비즈니스 로직 코드에서이 제한을 구현하지 말아야 말을하지 않았다.

  3. ==============================

    3.난 너랑 같이있어. 세부 사항에 까다로운주의 목에 통증과 제한 값이 있습니다.

    난 너랑 같이있어. 세부 사항에 까다로운주의 목에 통증과 제한 값이 있습니다.

    옛날 옛적에, 디스크 소중한 상품이었고, 우리는 그것을 최적화하기 위해 총알을 땀을하는 데 사용됩니다. 스토리지의 가격은 모든 바이트 덜 중요한 압박에 소요되는 시간을 1,000 배로 떨어졌다.

    만 CHAR 필드를 사용하는 경우에는 고정 길이 행을 얻을 수 있습니다. 이 필드에 대한 정확한 크기를 집어 경우에 약간의 디스크 실제 재 작성을 절약 할 수 있습니다. 당신은 더 조밀하게 포장 데이터 (테이블 스캔에 대한 적은 I / O의) 빠른 업데이트를 얻을 수 있습니다 (쉽게 업데이트 및 삽입을위한 블록의 열린 공간을 찾습니다.)

    당신이 당신의 크기를 과다 추정, 또는 실제 데이터 크기가 다양하다 그러나, 당신은 CHAR 필드와 공간을 낭비하는 바람이 있습니다. 데이터는 (로 이어지는 더 많은 I / O의 큰 취득에서는 용) 덜 조밀 바람됩니다.

    일반적으로, 변수 필드의 크기를 넣어 시도에서 성능상의 이점은 사소한 있습니다. 당신이 차이를 측정 할 수 있다면 당신은 쉽게 VARCHAR CHAR (x)에 비해 (255)를 사용하여 벤치 마크는 볼 수 있습니다.

    그러나 때때로, 나는 "작은", "중간", "대형"힌트를 제공해야합니다. 나는 크기 16, 64, 255 사용 그래서.

  4. ==============================

    4.요즘, 난 정말 더 이상 중요한 상상할 수 없다.

    요즘, 난 정말 더 이상 중요한 상상할 수 없다.

    이 가변 길이 필드를 사용으로 계산 오버 헤드는하지만 CPU를 오늘의 과잉으로, 그것은 고려 가치도 아니다. 의 I / O 시스템은 느린 핸들이 효과적으로 존재하지 않는으로 VARCHAR에 어떤 계산 비용을 만드는 방법과 같다. 사실, VARCHAR의 가격은 계산 고정 길이 필드를 통해 가변 길이 필드를 사용하여 저장 한 디스크 공간의 양에 비해 순 승리는 아마도. 당신이 가장 가능성이 큰 행 밀도를 가지고있다.

    이제 VARCHAR 필드의 복잡성은 쉽게 그것의 레코드 번호를 통해 레코드를 찾을 수 없다는 것입니다. 당신이 (고정 길이 필드) 고정 길이 행 크기가있는 경우, 그 행 ID 포인트 디스크 블록을 계산하기 위해 사소한. 가변 길이 행 크기로, 그런 종류의 창을 꺼집니다.

    그래서, 지금 당신은 다른 모든 기본 키와 같은 레코드 번호 지수의 일종을 유지하기 위해 필요, 또는 당신은 강력한 행 ID를 만들 필요가 그 식별자에 (예 : 블록 등) 인코딩 세부. 당신이 할 경우, 그래도 ID는 이제까지 행이 영구 저장소에 이동하는 경우 다시 계산되어야 할 것이다. 더 큰 문제는 바로 인덱스 항목을 모두 다시 결코 수가 신뢰할 주장) 확인 당신이 중 하나) 소비자 또는 b에 노출 결코 할 필요가 없습니다.

    오늘날 우리가 VARCHAR 필드가 있기 때문에하지만, VARCHAR (255)를 통해 VARCHAR (16)의 유일한 값은 DB가 VARCHAR (16)에 16 문자 제한을 적용하는 것입니다. DB를 모델 물리적 데이터 모델의 실제 대표로되어 있다면, 가진 필드의 길이는 가치가있을 수 있습니다. 그러나, 단순히 "저장"보다는 "모델 및 저장"이라면 무엇이든지 필요가 없습니다.

    그럼 당신은 단순히 (텍스트 또는 CLOB 필드처럼)하지 뭔가 대 색인하는 텍스트 필드 (예 : VARCHAR) 분별해야합니다. 인덱서 블 필드는 CLOB 필드 (이유 이내)하지 않는 반면에 인덱스를 용이하게하기 위해 크기에 제한을 가지고하는 경향이있다.

  5. ==============================

    5.255 개 문자의 데이터 유형을 허용하는 경우 내 경험에 의하면, 바보 같은 사용자 (또는 숙련 된 테스터) 실제로을 채울 것입니다.

    255 개 문자의 데이터 유형을 허용하는 경우 내 경험에 의하면, 바보 같은 사용자 (또는 숙련 된 테스터) 실제로을 채울 것입니다.

    그런 다음 당신은 당신이 당신의 응용 프로그램에 표시 보고서에 그 필드와 화면에 할 수있는 공간을 포함한 모든 종류의 문제가있다. (당신이 255 개 문자 필드의 몇 가지보다 더 한 경우) 데이터베이스의 데이터에 대한 당 행 제한을 초과의 가능성을 언급 할 필요가 없을 것입니다.

    더 쉽게는, 처음에 적절한 제한을 선택하고 응용 프로그램 및 데이터베이스를 통해 그 시행합니다.

  6. ==============================

    6.그것은 당신이 필요 이상 조금 밖에 할당하는 것이 좋습니다입니다. 전화 번호는이 대형을 가지 않을 것입니다.

    그것은 당신이 필요 이상 조금 밖에 할당하는 것이 좋습니다입니다. 전화 번호는이 대형을 가지 않을 것입니다.

    한 가지 이유는 당신이 큰 항목에 대해 확인하지 않는 한, 의심의 여지 사람 모두가 사용하지 않는 것입니다. 그런 다음 당신은 당신의 행에 공간이 부족할 수 있습니다. 나는 MySQL의 제한에 대한 모르겠지만 8060은 MS SQL에서 최대 행 크기입니다.

    보다 일반적인 기본값은 50 이럴 수 있으며, 필요가 그것을 증명하는 경우 다음 증가 할 것입니다.

  7. ==============================

    7.말했다 VARCHAR 컬럼에 인덱스 작업을 할 때 MySQL은 최대를 가지고 같은 MySQL의 맥락에서 그것은 중요한 얻을 수 있습니다. 인덱스 행 당 767bytes의 제한합니다.

    말했다 VARCHAR 컬럼에 인덱스 작업을 할 때 MySQL은 최대를 가지고 같은 MySQL의 맥락에서 그것은 중요한 얻을 수 있습니다. 인덱스 행 당 767bytes의 제한합니다.

    여러 VARCHAR에 걸쳐 255 열을 인덱스를 추가 할 때 답변 위의 지적대로 더 빨리 UTF8 또는 utf8mb4 열을 / 오히려 빨리이 한계에 도달 할 수있는이 수단

  8. from https://stackoverflow.com/questions/262238/are-there-disadvantages-to-using-a-generic-varchar255-for-all-text-based-field by cc-by-sa and MIT license