sourcetip

차(1)와 작은 인트(1) 중 어느 것이 더 빠릅니까? 왜죠?

fileupload 2023. 9. 20. 20:39
반응형

차(1)와 작은 인트(1) 중 어느 것이 더 빠릅니까? 왜죠?

나의 플랫폼:

PHP & mySQL

내 상황:

테이블의 열 중 하나에 사용자 선택을 위한 값을 저장해야 하는 상황이 발생했습니다.이제 제 옵션은 다음과 같습니다.

  1. 열을 문자(1)로 선언하고 값을 'y' 또는 'n'으로 저장합니다.
  2. 또는 Column을 tinyint(1)로 선언하고 값을 1 또는 0으로 저장합니다.
  3. 이렇게 선언된 열은 응용프로그램 내에서 사용할 수 있도록 색인화될 수도 있습니다.

질문:

그래서 저는 위의 두 가지 유형 중 어떤 것이 있는지 알고 싶었습니다.

  1. 해당 열에 액세스할 때 쿼리 속도가 빨라집니다(단순화를 위해 다른 쿼리를 섞거나 다른 열에 액세스하는 것은 생략합니다).

  2. 데이터를 저장하고 액세스하는 가장 효율적인 방법은 무엇이며 그 이유는 무엇입니까?

  3. 열이 색인화된 경우와 그렇지 않은 경우 액세스 속도는 어떻게 달라집니까?

char(1)과 tinyint(1)는 1바이트 공간만 차지하므로 이 경우 저장공간은 문제가 되지 않을 것으로 알고 있습니다.그러면 남은 것은 접속 속도입니다.제가 알기로는 숫자 색인이 무엇보다 빠르고 효율적입니다.하지만 여기 사건은 결정하기 어려운 문제라고 생각합니다.이것에 대한 당신의 경험을 꼭 듣고 싶습니다.

미리 감사드립니다.

                       Rate insert tinyint(1) insert char(1) insert enum('y', 'n')
insert tinyint(1)     207/s                --            -1%                  -20%
insert char(1)        210/s                1%             --                  -19%
insert enum('y', 'n') 259/s               25%            23%                    --
                       Rate insert char(1) insert tinyint(1) insert enum('y', 'n')
insert char(1)        221/s             --               -1%                  -13%
insert tinyint(1)     222/s             1%                --                  -13%
insert enum('y', 'n') 254/s            15%               14%                    --
                       Rate insert tinyint(1) insert char(1) insert enum('y', 'n')
insert tinyint(1)     234/s                --            -3%                   -5%
insert char(1)        242/s                3%             --                   -2%
insert enum('y', 'n') 248/s                6%             2%                    --
                       Rate insert enum('y', 'n') insert tinyint(1) insert char(1)
insert enum('y', 'n') 189/s                    --               -6%           -19%
insert tinyint(1)     201/s                    7%                --           -14%
insert char(1)        234/s                   24%               16%             --
                       Rate insert char(1) insert enum('y', 'n') insert tinyint(1)
insert char(1)        204/s             --                   -4%               -8%
insert enum('y', 'n') 213/s             4%                    --               -4%
insert tinyint(1)     222/s             9%                    4%                --

enum('y', 'n')에 삽입하는 것이 더 빠릅니다.

                       Rate select char(1) select tinyint(1) select enum('y', 'n')
select char(1)        188/s             --               -7%                   -8%
select tinyint(1)     203/s             8%                --                   -1%
select enum('y', 'n') 204/s             9%                1%                    --
                       Rate select char(1) select tinyint(1) select enum('y', 'n')
select char(1)        178/s             --              -25%                  -27%
select tinyint(1)     236/s            33%                --                   -3%
select enum('y', 'n') 244/s            37%                3%                    --
                       Rate select char(1) select tinyint(1) select enum('y', 'n')
select char(1)        183/s             --              -16%                  -21%
select tinyint(1)     219/s            20%                --                   -6%
select enum('y', 'n') 233/s            27%                6%                    --
                       Rate select tinyint(1) select char(1) select enum('y', 'n')
select tinyint(1)     217/s                --            -1%                   -4%
select char(1)        221/s                1%             --                   -2%
select enum('y', 'n') 226/s                4%             2%                    --
                       Rate select char(1) select tinyint(1) select enum('y', 'n')
select char(1)        179/s             --              -14%                  -20%
select tinyint(1)     208/s            17%                --                   -7%
select enum('y', 'n') 224/s            25%                7%                    --

하는 것 인 것 같습니다.enum. 코드는 여기서 찾을 수 있습니다.

를 사용하여 열을 생성해야 할 것 같습니다. Mysql은 이 유형을 최적의 방법으로 저장합니다.또한 필드에 허용된 값만 저장할 수 있습니다.

당신은 또한 그것을 더 인간 친화적으로 만들 수 있습니다.ENUM('no','yes')실적에 영향을 주지 않고왜냐하면 끈은'no'그리고.'yes'됩니다 당 한 됩니다.ENUM정의. 은 행당합니다.Mysql은 행당 값의 인덱스만 저장합니다.

정렬하는 합니다.ENUM열:

ENUM 값은 열거 멤버가 열 규격에 나열된 순서에 따라 정렬됩니다.(즉, ENUM 값은 인덱스 번호에 따라 정렬됩니다.)예를 들어 'a'는 ENUM('a', 'b')의 경우 'b' 앞에 정렬되지만 'b'는 ENUM('b', 'a')의 경우 'a' 앞에 정렬됩니다.

작은 int를 사용하는 것이 더 표준적인 방법이며, 필드의 값을 더 쉽게 확인할 수 있습니다.

// Using tinyint 0 and 1, you can do this:
if($row['admin']) {
    // user is admin
}

// Using char y and n, you will have to do this:
if($row['admin'] == 'y') {
    // user is admin
}

MySQL의 내부 작업에 대한 전문가는 아니지만, 문자 필드보다 정수 필드를 검색하고 정렬하는 것이 빠르다는 것을 직관적으로 느낍니다('a' > 'z'가 0 > 1보다 더 많은 작업이라는 느낌을 받을 뿐입니다). 0과 1이 표준 온/오프 플래그인 컴퓨팅 관점에서 훨씬 더 친숙하게 느껴지는 것 같습니다.따라서 정수에 대한 저장 공간이 더 좋고, 더 기분이 좋고, 코드 로직에서 사용하기가 더 쉬운 것 같습니다.저는 0/1이 확실한 승자입니다.

이는 MySQL의 공식적인 입장이며, 문서를 통해 확인할 수 있습니다.

부울, 부울: 이 유형들은 TINYINT(1)의 동의어입니다.0의 값은 거짓으로 간주됩니다.0이 아닌 값은 참으로 간주됩니다.

MySQL이 TINYINT(1)와 Boolean을 동일시할 정도로 나아간다면 가야 할 길처럼 보입니다.

확실히 알기 위해서는 벤치마킹을 해야 합니다.또는 전체 프로젝트의 큰 관점에서 볼 때 그것은 아마도 그렇게 중요하지 않을 것임을 알아야 합니다.

char 컬럼에는 인코딩과 콜렉션이 있으며, 이를 비교하는 것은 인코딩 간에 불필요한 전환을 수반할 수 있으므로 int가 더 빠를 것이라고 추측합니다.같은 이유로 int 열에 인덱스를 업데이트하는 것도 더 빠르다고 생각합니다.하지만 역시 별로 중요하지 않을 것입니다.

CHAR선택한 문자 집합 및 테이블 옵션에 따라 1바이트 이상을 사용할 수 있습니다.일부 문자는 인코딩하는 데 3바이트가 소요될 수 있으므로 MySQL은 때때로 다음과 같은 공간만 사용해도 해당 공간을 예약합니다.y그리고.n.

둘 다 너무 가까워서 상관없을 겁니다.SO에 대해 이 질문을 해야 한다고 생각한다면, 지나치게 최적화하는 것입니다.가장 논리적으로 이치에 맞는 것을 사용하세요.

유형을 지정하는 경우BOOL아니면BOOLEANMySQL에서 테이블을 만들 때 열 유형으로 다음과 같이 열 유형을 만듭니다.TINYINT(1). 아마도 이것이 둘 중에 더 빠른 것 같습니다.

문서화

또한:

우리는 향후 MySQL 릴리즈에서 표준 SQL에 따라 전체 부울 타입 핸들링을 구현할 예정입니다.

문자열 처리 오버헤드(콜레이션, 공백 등)가 없기 때문에 TINYINT의 인덱스가 CHAR(1)의 인덱스보다 빠를 것이라고 생각하지만, 이를 뒷받침할 만한 사실이 없습니다.걱정할 만한 성능 차이는 크지 않은 것으로 추정됩니다.

그러나 PHP를 사용하기 때문에 TINYINT로 저장하는 것이 훨씬 더 합리적입니다.은 1/0 값을 하는 것과 .true그리고.false 에도, 이 할 수 있습니다.이 PHP 에도, .당신은 간단히 할 수 있습니다.if ($record['field'])항상 'y'와 'n' 사이에서 변환하는 대신 결과를 부울 체크로 사용합니다.

 TINYINT    1 Byte
CHAR(M)     M Bytes, 0 <= M <= 255

다른 점이 있습니까?

언급URL : https://stackoverflow.com/questions/2023476/which-is-faster-char1-or-tinyint1-why

반응형