>  기사  >  데이터 베이스  >  MySQL 데이터 유형의 이해

MySQL 데이터 유형의 이해

WJ
WJ앞으로
2020-05-30 10:07:201954검색

MySQL 데이터 유형의 이해

MySql 데이터 유형 이해:

Mysql의 고유한 기능과 구현 세부 사항으로 인해 성능에 미치는 영향은 명백합니다. 왜냐하면 Mysql 데이터베이스를 잘 설계하는 것이 중요하기 때문입니다. 데이터베이스 설계에서는 테이블 필드의 유형 선택을 언급해야 합니다. MySQL은 다양한 데이터 유형을 지원하므로 올바른 데이터 유형을 선택하는 방법은 고성능을 얻는 데 중요합니다. 저장하려는 데이터 유형이 무엇이든 일부 데이터베이스 설계 원칙에 따라 이를 고려해야 합니다.

데이터 유형 선택에 대한 고려

일반적으로 작은 것이 더 좋습니다. (일반적으로 데이터를 올바르게 저장하는 가장 작은 데이터 유형을 사용해야 합니다.)

왜?

(1) 데이터 유형이 작을수록 디스크, 메모리 및 CPU 캐시를 덜 차지하고 처리하는 데 필요한 CPU 주기가 더 적기 때문에 일반적으로 더 빠르기 때문입니다.
(2) 저장해야 하는 값의 범위를 과소평가하지 않도록 주의하세요. 데이터 유형의 최대값 범위에 비해 작은 값이 적용됩니다.
(3) 어떤 데이터 유형이 가장 좋은지 결정할 수 없는 경우 범위를 초과하지 않을 것으로 생각되는 가장 작은 유형을 선택하세요.

간단한 것이 좋습니다(단순한 데이터 유형에 대한 작업에는 일반적으로 더 적은 CPU 주기가 필요합니다.)

왜? 다음은 그 이유를 설명하는 몇 가지 예입니다.

(1) 문자열 집합과 조합 규칙(조합 규칙)이 정수 비교보다 문자 비교를 더 복잡하게 만들기 때문에 정수 연산은 문자열 연산보다 저렴합니다.
(2) 날짜와 시간을 저장하려면 MySQL에 내장된 유형(date, time, datatime)을 사용해야 합니다.
(3) IP 주소는 정수형(int)으로 저장되어야 합니다.

NULL(널 값)을 피하세요

왜요?

(1) 많은 테이블에는 열의 기본 속성이 NULL이기 때문에 프로그램이 NULL을 저장할 필요가 없더라도 NULL이 될 수 있는 열이 포함되어 있습니다. 실제로 NULL을 저장해야 하는 경우가 아니면 일반적으로 열에 NOT NULL을 지정하는 것이 가장 좋습니다.
(2) 쿼리에 NULL이 될 수 있는 열이 포함된 경우 NULL 열로 인해 인덱스, 인덱스 통계 및 값 비교가 더 복잡해지기 때문에 MySQL에서 최적화하기가 어렵습니다. NULL이 될 수 있는 열은 더 많은 저장 공간을 사용하며 Mysql에서는 특별한 처리가 필요합니다. NULL 가능 열이 인덱싱되면 각 인덱스 레코드에는 추가 바이트가 필요하며 이로 인해 고정 크기 인덱스가 MyISAM에서 가변 크기 인덱스가 될 수도 있습니다.
(3) 일반적으로 NULL 가능 열을 NOTNULL로 변경하면 성능이 거의 향상되지 않습니다. 해당 열에 인덱스를 구축하려는 경우 해당 열을 NULL 가능 열로 설계하지 않도록 해야 합니다. (예외가 있는데, InnoDB에서는 NULL 값을 저장하기 위해 별도의 비트를 사용하므로 sparse 데이터에 대한 공간 효율성이 좋습니다.)

요약

컬럼의 데이터 유형을 선택할 때, 첫 번째 단계는 일반적으로 매우 간단한 적절한 대형 유형(숫자, 문자열, 시간 등)을 결정하는 것이며, 다음 단계는 특정 유형을 선택하는 것입니다.

많은 MySQL 데이터 유형은 동일한 유형의 데이터를 저장할 수 있지만 저장 길이와 범위가 다르거나 허용되는 정밀도가 다르거나 필요한 물리적 공간(디스크 및 메모리 공간)이 다릅니다. 동일한 대형 유형의 데이터의 다양한 하위 유형에는 때때로 특별한 동작과 속성이 있습니다. 예: 데이터타임 그리고 TIMESAMP 열은 동일한 유형의 데이터(시간 및 날짜)를 저장할 수 있으며 초 단위까지 정확합니다. 그러나 TIMESTAMP는 DATATIME 저장 공간의 절반만 사용하며 시간대 변경에 따라 특별한 자동 업데이트 기능을 제공합니다. 또한, TIMESTAMP가 허용하는 시간 범위는 훨씬 더 작으며 때로는 특수 능력이 장애물이 될 수 있으므로 개발자는 이를 고려해야 합니다.

정수형

숫자에는 정수와 실수 두 가지 유형이 있습니다.

정수를 저장하는 경우 TINNYINT(8), SMALLINT(16), MEDIUMINT(24), INT(32), BIGINT(64)와 같은 정수 유형을 사용할 수 있습니다.

정수 유형에는 선택적 UNSIGNED 속성이 있는데, 이는 음수 값이 허용되지 않음을 의미하며, 이는 양수의 상한을 대략 두 배로 늘릴 수 있습니다.

예: TINYINT UNSIGNED는 0~255 범위를 저장할 수 있지만 TINYINT의 저장 범위는 -127~128입니다.

Signed 유형과 unsigned 유형은 동일한 저장 공간을 사용하고 동일한 기능을 갖습니다.

그래서 선택할 수 있습니다 실제 상황에 따라 적절한 유형.

귀하의 선택에 따라 Mysql이 메모리와 디스크에 데이터를 저장하는 방법이 결정됩니다.

정수는 32비트 환경에서도 일반적으로 64비트 BIGINT 정수를 선택합니다. (그러나 일부 집계 함수는 예외이며 DECIMAL 또는 DOUBLE을 사용하여 계산됩니다.)

Mysql은 정수 유형의 너비를 지정할 수 있습니다.

예: INT(11)는 대부분의 응용 프로그램에 의미가 없습니다. 값의 합법적인 범위를 제한하지 않고 Mysql의 일부 대화형 도구(예: Mysql 명령줄 클라이언트)에서 사용하는 개별 문자만 지정합니다. 숫자를 표시합니다. 저장 및 계산 목적에서는 INT(1)과 INT(20)이 동일합니다.

일부 타사 스토리지 엔진(예: Infobright)에는 때때로 사용자 정의된 스토리지 형식과 압축 구성표가 있지만 반드시 일반적인 Mysql 내장 엔진을 사용하지는 않습니다.

실수 유형

실수는 소수 부분이 있는 숫자입니다.

미래의 소수 부분을 저장할 뿐만 아니라 DECIMAL을 사용하여 BIGINT보다 큰 정수를 저장할 수도 있습니다. MySQL은 정확한 유형과 부정확한 유형을 모두 지원합니다. DECIMAL 유형은 정확한 소수점을 저장하는 데 사용됩니다.

정확한 연산은 Mysql5.0 이상에서 지원되지만 Mysql4.1 및 이전 버전에서 부동 소수점 연산을 사용하는 경우 예외가 발생합니다(주로 정밀도 손실로 인해 발생). FLOAT 및 DECIMAL 유형 모두 진행 상황을 지정할 수 있습니다.

DECIMAL 열의 경우 소수점 앞뒤에 허용되는 최대 자릿수를 지정할 수 있으며 이는 열의 공간 소비에 영향을 미칩니다. FLOAT(부동 소수점) 열에 필요한 정밀도를 지정하는 방법에는 여러 가지가 있습니다. 이렇게 하면 Mysql이 자동으로 다른 데이터 유형을 선택하거나 저장할 때 값을 반올림하게 됩니다. 그러나 이러한 정밀도는 종종 비표준입니다. 일반적으로 지정된 데이터 유형이 정밀도를 지정하지 않는 경우에만 권장됩니다.

추가 공간과 계산 오버헤드가 필요하므로 소수에 대한 정확한 계산을 수행할 때는 DECIMAL만 사용하도록 해야 합니다. 예를 들어 금융 데이터를 저장할 때 데이터의 양이 상대적으로 크다면 DECIMAL 대신 BIGINT를 사용하는 것을 고려하고, 저장할 통화 단위에 소수 자릿수에 따라 해당 배수를 곱할 수 있습니다. FLOAT 및 DOUBLE 유형은 표준 부동 소수점 연산을 사용한 대략적인 계산을 지원합니다.

문자열 유형

Mysql은 여러 문자열 유형을 지원하며 각 유형에는 다양한 변형이 있습니다. 그 중에서 가장 중요한 두 가지 문자열 유형은 VARCHAR과 CHAR입니다.

참고: Mysql 스토리지 엔진이 CHAR 또는 VARCHAR 값을 저장하는 방식은 메모리와 디스크에서 다를 수 있으므로 스토리지 엔진에서 Mysql 서버가 읽은 값을 다른 값으로 변환해야 할 수도 있습니다. 저장 형식. 注意:Mysql存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不一样,所以Mysql服务器从存储引擎读取的值可能需要转换为另外一种存储格式。

VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。

VARCHAR比定长类型更节省空间,因为它仅使用必要的空间(越短的字符串使用越少的空间)。

VARCHAR需要使用1或2个额外字节记录字符串的长度。

VARCHAR节省了存储空间,所以对性能是有帮助的。

下面是一些VARCHAR适合使用的场景:
(1)字符串列的最大长度比平均长度大很多。
(2)列的更新很少,所以碎片不是问题。
(3)使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储。

CHAR类型是定长的。(Mysql总是根据定义的字符串长度分配足够的空间)

CHAR适合存储很短的字符串,或者所有值都接近同一个长度。

和VARCHAR和CHAR类似的类型还有BINARY和VARBINARY,它们存储的都是二进制字符串。

注意:使用VARCAHR(5)和VARCHAR(200)存储“hello”的空间开销都是一样的,那么使用更短的列有什么优势呢?(事实证明有很大的优势)

更长的列会消耗更多的内存,因为Mysql通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或者操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。

注意:归根到底,最好的策略是只分配真正需要的空间。

BLOB和TEXT类型

BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别使用二进制和字符方式存储。

实际上它们分别属于两组不同的数据类型家族:字符串类型有TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT;

二进制类型有TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB;

ENUM类型

可以使用枚举(ENUM)代替字符串类型。很多时候建议使用枚举列代替常用的字符串类型。

(1)枚举列可以把一些不重复的字符串存储成一个预定义的集合。
(2)Mysql在存储枚举时非常紧凑,会根据列表值的数量压缩到一到两个字节中。
(3)Mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的“查找表”。

注意:有一个令人吃惊的地方是,枚举字段是按照内部存储的整数而不是定义的字符串进行排序的。

注意:枚举最不好的地方是:字符串列表是固定的,添加或者删除字符串必须使用ALTER TABLE,因此对于一系列未来可能会改变的字符串,使用枚举并不是一个好主意,除非接受只能在列表末尾添加元素。

注意:由于Mysql把每个枚举值保存为整数,并且必须进行查找才能转换为字符串,所以枚举列有一些开销。

VARCHAR 유형은 가변 길이 문자열을 저장하는 데 사용되며 가장 일반적인 문자열 데이터 유형입니다.

VARCHAR은 필요한 공간만 사용하기 때문에 고정 길이 유형보다 공간 효율적입니다(문자열이 짧을수록 공간을 덜 사용함).

VARCHAR에는 문자열 길이를 기록하기 위해 1~2바이트의 추가 바이트가 필요합니다. 🎜🎜VARCHAR는 저장 공간을 절약하므로 성능에 도움이 됩니다. 🎜🎜🎜다음은 VARCHAR을 사용하기에 적합한 몇 가지 시나리오입니다. 🎜(1) 문자열 열의 최대 길이가 평균 길이보다 훨씬 깁니다. 🎜(2) 열은 거의 업데이트되지 않으므로 조각화는 문제가 되지 않습니다. 🎜(3) UTF-8과 같은 복잡한 문자 집합이 사용되며 각 문자는 저장에 다른 바이트 수를 사용합니다. 🎜🎜🎜CHAR 유형은 고정 길이입니다. (Mysql은 항상 정의된 문자열 길이에 따라 충분한 공간을 할당합니다.) 🎜🎜CHAR은 매우 짧은 문자열을 저장하거나 모든 값이 동일한 길이에 가까워서 저장하는 데 적합합니다. 🎜🎜 VARCHAR 및 CHAR와 유사한 유형은 바이너리 문자열을 저장하는 BINARY 및 VARBINARY입니다. 🎜🎜참고: VARCAHR(5) 및 VARCHAR(200)을 사용하여 "hello"를 저장하는 공간 오버헤드는 동일합니다. 그렇다면 더 짧은 열을 사용하면 어떤 이점이 있나요? (큰 장점으로 판명됨) 🎜🎜Mysql은 일반적으로 내부 값을 보관하기 위해 고정 크기 메모리 블록을 할당하기 때문에 열이 길수록 더 많은 메모리를 소비합니다. 이는 정렬이나 작업을 위해 메모리 내 임시 테이블을 사용할 때 특히 나쁩니다. 디스크 임시 테이블을 사용하여 정렬할 때도 마찬가지로 나쁩니다. 🎜🎜참고: 궁극적으로 가장 좋은 전략은 꼭 필요한 공간만 할당하는 것입니다. 🎜🎜BLOB 및 TEXT 유형🎜🎜BLOB 및 TEXT는 각각 바이너리 및 문자 저장소를 사용하여 대용량 데이터를 저장하도록 설계된 문자열 데이터 유형입니다. 🎜🎜사실 이들은 두 가지 다른 데이터 유형 그룹에 속합니다. 문자열 유형에는 TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT 및 LONGTEXT가 포함됩니다. 🎜🎜이진 유형에는 TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB 및 LONGBLOB이 포함됩니다. type🎜 🎜🎜문자열 형식 대신 열거형(ENUM)을 사용할 수 있습니다. 일반적으로 사용되는 문자열 유형 대신 열거형 열을 사용하는 것이 권장되는 경우가 많습니다. 🎜🎜(1) 열거형 열은 일부 고유 문자열을 미리 정의된 컬렉션에 저장할 수 있습니다. 🎜(2) Mysql은 열거형을 저장할 때 매우 컴팩트하며 목록 값의 수에 따라 1바이트 또는 2바이트로 압축됩니다. 🎜(3) Mysql은 내부적으로 목록의 각 값의 위치를 ​​정수로 저장하고, "숫자-문자열" 매핑 관계의 "조회 테이블"을 테이블의 .frm 파일에 저장합니다. 🎜🎜참고: 한 가지 놀라운 점은 열거형 필드가 정의된 문자열 대신 내부에 저장된 정수로 정렬된다는 것입니다. 🎜🎜참고: 열거형의 가장 나쁜 점은 문자열 목록이 고정되어 있다는 것입니다. 문자열을 추가하거나 삭제하려면 ALTER TABLE을 사용해야 하므로 나중에 변경될 수 있는 일련의 문자열에는 열거형을 사용하지 마세요. 목록의 끝에만 요소를 추가할 수 있다는 점을 받아들이지 않는 한 좋은 생각입니다. 🎜🎜참고: MySQL은 각 열거 값을 정수로 저장하고 이를 문자열로 변환하기 위해 조회를 수행해야 하기 때문에 열거 열에 약간의 오버헤드가 있습니다. 🎜🎜🎜날짜 및 시간 유형🎜🎜

Mysql에는 YEAR, DATE 등 날짜 및 시간 값을 저장할 수 있는 다양한 유형이 있습니다.

Mysql이 저장할 수 있는 최소 시간 단위는 초입니다(MariaDB는 마이크로초 수준 이벤트 유형을 지원합니다). 그러나 MySQL은 마이크로초 수준의 세분성으로 임시 작업을 수행할 수도 있습니다.

대부분의 경우 유형에 대한 대안이 없으므로 무엇이 최선의 선택인지 의문의 여지가 없습니다.

다음 유일한 질문은 날짜와 시간을 저장할 때 무엇을 해야 하느냐는 것입니다.

DATETIME

(1) 이 유형은 1001부터 9999까지 광범위한 값을 초 단위의 정밀도로 저장할 수 있습니다.
(2) DATETIME은 시간대에 관계없이 시간과 날짜를 YYYYMMDDHHMMSS 형식의 정수로 캡슐화합니다.
(3)DATETIME은 8바이트의 저장 공간을 사용합니다.

TIMESTAMP

(1) TIMESTAMP 유형은 1970년 1월 1일 자정 이후의 초 수를 저장하며 이는 UNIX의 타임스탬프와 동일합니다.
(2) TIMESTAMP는 저장 공간을 4바이트만 사용하므로 범위가 DATETIME보다 훨씬 작습니다.
(3) TIMESTAMP에 표시되는 값은 시간대에 따라 다릅니다.

DATETIME과 TIMESTAMP 비교:

(1) 기본적으로 삽입 시 첫 번째 TIMESTAMP 열의 값을 지정하지 않으면 Mysql은 이 열의 값을 현재 시간으로 설정합니다. (DATETIME에는 없는 기능입니다.)
(2) 레코드 행을 삽입할 때 MySQL은 기본적으로 첫 번째 TIMESTAMP 열의 값도 업데이트합니다.
(3) TIMESTAMP 열의 기본값은 NOT NULL로, 이는 다른 데이터 유형과 다릅니다.

Summary

(1) 특별한 동작 외에도 TIMESTAMP는 일반적으로 DATETIME보다 공간 효율적이므로 가능할 때마다 사용해야 합니다.
(2) 일반적으로 UNIX 타임스탬프를 정수 값으로 저장하는 것은 권장되지 않습니다. 정수로 타임스탬프 형식을 저장하는 것은 일반적으로 처리가 불편합니다.
(3) 초보다 작은 단위로 날짜 및 시간 값을 저장해야 하는 경우 BIGINT 유형을 사용하여 마이크로초 수준의 타임스탬프를 저장하거나 DOUBLE을 사용하여 초 이후의 소수 부분을 저장할 수도 있습니다. MySQL 대신 MariaDB.

Bit 데이터 유형

BIT은 단일 비트를 포함하는 필드를 정의하고, BIT(2)는 2비트를 저장하며 최대 길이는 64비트입니다.

참고: 일반적으로 BIT 유형을 주의해서 사용하는 것이 좋습니다. 대부분의 애플리케이션에서는 이 유형을 사용하지 않는 것이 가장 좋습니다. 注意:一般建议谨慎使用BIT类型,对于大部分应用来讲最好避免使用这种类型。

选择标识符

为identifier(标识列)选择合适的数据类型非常重要。

一般来讲更有可能用标识列与其他值进行比较,或者通过标识列寻找其他列。

当选择标识列的类型时,不仅仅需要考虑存储类型,还需要考虑Mysql对这种类型怎么执行计算和比较。

一旦选定了一种类型,要确保在所有关联表中都使用同样的类型。

在可以满足值的范围需求,并且预留未来增长空间的前提下,应该选择最小的数据类型。

注意:整数通常是标识列最好的选择,因为它们很快而且可以使用AUTO_INCREMENT。注意:ENUM和SET是最糟糕的选择了;如果可能也尽可能避免使用字符串作为标识列,因为它们很消耗空间并且通常比数字类慢。

식별자 선택

식별자(식별 열)에 적합한 데이터 유형을 선택하는 것이 매우 중요합니다.

일반적으로 다른 값과 비교하기 위해 식별 열을 사용하거나, 식별 열을 통해 다른 열을 찾을 가능성이 높습니다.

ID 열 유형을 선택할 때 저장 유형뿐만 아니라 Mysql이 이 유형에 대해 계산 및 비교를 수행하는 방법도 고려해야 합니다.

유형을 선택한 후에는 모든 관련 테이블에서 동일한 유형을 사용해야 합니다.

값의 범위 요구 사항을 충족할 수 있고 향후 성장 여지가 있다는 전제 하에 가장 작은 데이터 유형을 선택해야 합니다. 참고: 정수는 속도가 빠르고 AUTO_INCREMENT를 사용할 수 있기 때문에 일반적으로 ID 열에 가장 적합합니다. 참고: ENUM 및 SET은 최악의 선택입니다. 가능하면 문자열을 ID 열로 사용하지 마십시오. 공간을 많이 차지하고 일반적으로 숫자 유형보다 느립니다.

전체 텍스트 요약🎜🎜🎜데이터베이스 디자인에서는 가장 적합한 데이터 열 유형을 선택하고 데이터 열의 크기를 결정하기 전에 두 번 생각해야 합니다. 실제로 어떤 유형의 요구 사항에 대한 데이터 테이블 디자인에 관계없이 매우 중요하고 매우 중요한 원칙 하나만 기억하면 됩니다. 올바르게 저장할 수 있는 가장 작은 데이터 유형을 사용하십시오. 데이터를 최대한 많이. 🎜🎜이상은 MySQL 데이터 유형에 대한 이해에 관한 것입니다. 🎜🎜관련 참조🎜🎜PHP 중국어 웹사이트🎜🎜🎜🎜

위 내용은 MySQL 데이터 유형의 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51dev.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제