`
lfq618
  • 浏览: 88445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql中关于bit,enum,tinyint三种数据类型的差别

 
阅读更多

如果有说的不对的地方,请拍砖,以下总结的这些都是边测试边查资料和自己的分析,可能会存在一些错误的地方。

 

之前我们纠结过该使用哪些类型。

 

对此我做了很多测试。发现这三种类型,存储所占空间是一样的。对于查询效率上来讲由于查询的时间会受到其他因素的影响,所以我只看了一下大概值,这三种类型的数据在搜索速度上基本可以说也是一样的。

 

 

使用bit类型的表:

CREATE TABLE `test_bit` (

  `my_bit` bit(1) NOT NULL DEFAULT b'0',

  KEY `my_bit` (`my_bit`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

使用enum类型的表:

CREATE TABLE `test_enum` (

  `my_enum` enum('0','1') NOT NULL DEFAULT '0',

  KEY `my_enum` (`my_enum`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

使用tinyint类型的表:

CREATE TABLE `test_tinyint` (

  `my_tinyint` tinyint(1) NOT NULL DEFAULT '0',

  KEY `my_tinyint` (`my_tinyint`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

 

我用脚本分别向这三个表中插入1000万的数据。每个表第一个字段是0或1。第二个字段是个大写英文字母,用来作为查询时匹配的条件。

插入完毕之后,看了一下表的状态:

 

 

 

查询的时间由于会受到别的因素的影响,每次都不一样,我就不贴了,总之非常接近。

 

其实一开始我被bit(1)这个1给忽悠了。我以为他存储时真的只占1位,而实际上你指定了这个bit(1),所能插进去的二进制的确只有0和1(插入时要b'0'或b'1',直接插0或1插进去的是十进制的)。你多插入的值会被截断,比如插入一个b'10',插进去后就变成了1。但他最小所占空间就是1字节,是8位。mysql手册上写明了

BIT(M)

大约(M+7)/8个字节

我指定bit(1),根据他的公式,还是要占1个字节。

 

 

Bit(M)这个M,其实起的作用只是做限了个限制,并不会实际减少数据对1字节的占用。1位的范围是二进制的0-1,2位是00-11,3位就是000-111….他里面直接存储的是二进制值。

 

 

 

enum的存储原理我仔细查看了下手册。是这样的:

在建立这个字段时,我们会给他规定一个范围比如enum('a','b','c'),这时mysql内部会建立一张hash结构的map表,类似:0000 -> a,0001 -> b,0002 -> c。

当我插入一条数据,此字段的值位a或b或c时,他存储在里面的不是这个字符,而是对应他的索引,也就是那个0000或0001或0002。

同样,enum在mysql手册上的说明:

ENUM('value1','value2',...)

1或2个字节,取决于枚举值的个数(最多65,535个值)

除非enum的个数超过了一定数量,否则他所占的存储空间也总是1字节。

 

 

 

还有那个set类型。他的存储原理和enum差不多。只不过他可以存储字符串集合,set('a','b','c')。在数据库内部也是先建立map表,数据存储的实际上是索引,他最多只支持64个元素,因为他最大是8个字节,因为在a,b,c这个集合中允许的值为a,b,c的所有排列组和。64个元素的话,每一条数据的值需要用最大需要用8*8位的索引去指向才能表达这个值。

 

 

 

还有tinyint:

类型

字节

最小值

最大值

 

 

(带符号的/无符号的)

(带符号的/无符号的)

TINYINT

1

-128

127

他的最小存储所占空间也是1字节。

 

 

 

 

最后做一个清晰点的测试,我去掉了以上3个表的my_text字段,只保留bit,enum,tinyint这三个类型的字段,然后各插入一个值:

insert into test_bit(`my_bit`) values(b'1');

insert into test_enum(`my_enum`) values('1');

insert into test_tinyint(`my_tinyint`) values(1);

 

 

 

 

 

所以基于以上来看,用这三种类型哪种来当作枚举字段或布尔字段,效果基本一样。也可能我只是单机测试,不是很能说明问题,因为使用bit,select出来时需要使用bin函数或那个字段+0来做一步转换成十进制我们这边才可以使用。enum需要在mysql内部根据map的索引找一下他真实的值。而tinyint只是直接从他内部取出来。理论上来讲,tinyint应该比其他两种效率强在他不用做那次转换。

 

 

虽然所占空间和查询效率上来讲基本一致,但他们毕竟还是有不同的地方:

Bit类型,比较适合直接存储二进制。

 

Enum,既然要用它,就不必要使用什么0,1,2来代替实际的字符串了。甚至中文字符串。他并不会对数据库性能进行多余开销。因为对于它来说,你使用'0','1','2'和'张三','李四','王五'数据表所占的存储空间一样。但是考虑到我们实际应用时数据需要从db服务器回传到web app,所以在网络传输时,当然还是尽可能的传输小数据比较好。所以如果很在意这些,还是不用它好了。

Tinyint,比较常用的是它,他也确实更加合适,使用它和enum的方式其实也类似,只不过我们把enum建立的那张map表建立在我们的web app端了。

分享到:
评论

相关推荐

    MySQL数据类型全掌握

    #### 三、MySQL与Oracle数据类型的对比 通过提供的案例,我们可以看到Oracle是如何定义其数据类型的。下面将对比MySQL与Oracle中的对应数据类型: 1. **整型**: 在案例中,Oracle使用了`NUMBER`类型,这类似于...

    MySQL 数据类型介绍.docx

    MySQL 数据类型是指系统中所允许的数据的类型。数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。如果使用错误的数据类型可能会...

    mysql数据类型详解.pdf

    MySQL中数据类型的选择对于数据库设计至关重要,它直接关系到数据存储的有效性和查询的效率。MySQL支持多种数据类型,可以分为几大类:数值型、日期时间型、字符型以及其他数据类型等。 数值型数据类型主要包括:...

    MYSQL 数据类型

    【MySQL 数据类型】是数据库设计中的关键概念,它决定了数据的存储方式、占用空间以及可接受的值的范围。MySQL 提供了丰富的数据类型,包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型以及二进制...

    sql mysql oracle数据类型

    【描述】: "本文将深入探讨 MySQL、Oracle 和 SQL Server 三大主流数据库系统中的数据类型,以及它们与 JDBC 数据类型的对应关系,帮助读者全面理解各数据库的数据类型差异和适用场景。" 在数据库设计中,数据类型...

    MySQL数据库应用实战教程第2章教案MySQL数据类型.pdf

    在本章"MySQL数据库应用实战教程"中,主要讲解了MySQL数据类型,这是数据库设计的基础。数据类型决定了数据的存储方式、占用空间以及可以存储的数据范围。以下是详细的知识点解析: 1. 数值类型: - MySQL支持严格...

    MySql Oracle SqlServer三大数据库的数据类型列表.pdf

    MySQL、Oracle 和 SQL Server 是三大主流的关系型数据库管理系统,它们都拥有各自的数据类型来支持不同的数据存储需求。数据类型的选择直接影响到数据的存储、检索和处理效率,因此了解这些数据库的数据类型列表至关...

    MS-sql、Oracle、Mysql、Informix数据类型集锦

    在本文中,我们将深入探讨四个流行的数据库管理系统——MS-SQL、Oracle、MySQL和Informix各自支持的主要数据类型。 MS-SQL(Microsoft SQL Server)提供了多种数据类型,以满足各种数据存储需求: 1. **bit**:...

    mysql与Oracle数据类型比较.pdf

    MySQL 和 Oracle 是两种广泛使用的数据库管理系统(DBMS),它们各自具有独特的数据类型系统来存储不同类型的数据。在进行跨数据库操作或者迁移时,了解这两种数据库之间的数据类型差异是至关重要的。以下是对MySQL...

    mysql与oracle数据类型对应关系.pdf

    这里我们将深入探讨MySQL与Oracle数据类型之间的对应关系,以及它们在Java编程语言中的映射。 1. MySQL数据类型: - BIGINT:MySQL中用于存储大整数,对应Oracle的NUMBER类型,可以表示非常大的数值。 - BIT:...

    MySQL数据类型

    ### MySQL数据类型详解 #### 数值类型 MySQL支持多种数值数据类型,这些类型根据其存储方式及数值范围的不同,可以大致分为两类:精确数值类型和近似数值类型。 ##### 精确数值类型 - **整数类型**: - **...

    第12章_MySQL数据类型精讲3

    本章节将深入讲解 MySQL 中的主要数据类型,包括整数类型、浮点类型、定点数类型、位类型、日期时间类型、文本字符串类型、枚举类型、集合类型、二进制字符串类型以及JSON类型和空间数据类型。 1. **整数类型**: ...

    完整精品数据库课件 MySQL从入门到精通 第05章 数据类型和运算符(共17页).ppt

    本章重点讲解了MySQL中的数据类型和运算符,这对于理解和操作MySQL数据库至关重要。 首先,我们来看MySQL的数据类型。数据类型决定了字段可以存储什么样的数据。在MySQL中,主要分为以下几大类: 1. **整数类型**...

    第12章_MySQL数据类型精讲1

    在第12章“MySQL数据类型精讲”中,讲师宋红康详细介绍了MySQL中的主要数据类型及其属性。 1. **整数类型**: - **TINYINT**: 1字节,有符号数范围是-128到127,无符号数范围是0到255。 - **SMALLINT**: 2字节,...

    mysql数据类型.doc

    在MySQL中,有多种数据类型可供选择,每种类型都有其特定的用途和限制。以下是对这些数据类型的详细解释: 1. 整数类型: - TINYINT(M):占用1字节,可选布尔类型(BIT, BOOL, BOOLEAN)。无符号时范围为0到255,...

    MySQL从入门到实战学习教程之3表操作.pptx

    其中,整型包括INTEGER、SMALLINT、TINYINT、MEDIUMINT和BIGINT五种类型。浮点型包括FLOAT和DOUBLE两种类型。定点类型包括DECIMAL和NUMERIC两种类型。 日期和时间类型 日期和时间类型用于表示日常的日期、时间信息...

    mysql知识点整理

    MySQL中的数据类型可以分为五大类:数值型、字符串类型、日期和时间类型、复合类型和NULL类型。 1. 数值型:包括整数型(INT、BIGINT、MEDIUMINT、SMALLINT、TINYINT)、浮点数型(FLOAT、DOUBLE、DECIMAL)和比特...

    MySqlOracleSqlServer三大数据库的数据类型列表汇编.docx

    【MySQL 数据类型】 MySQL 数据类型主要分为以下几类: 1. 整数类型:包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。这些类型用于存储整数,各类型有不同的存储范围和默认显示宽度。例如,TINYINT ...

    主流数据库数据类型的比较

    - MS SQL Server也有类似的整数类型,包括bit(用于二值数据)、int、smallint、tinyint和bigint。 - Oracle的整数类型主要是number,它支持不同精度和规模的整数,例如number(10)。 - DB2的整数类型包括smallint...

    mysql数据库中的大量存储类型[参考].pdf

    MySQL数据库中的存储类型是数据库设计的关键组成部分,它们决定了数据如何被存储、检索和处理。MySQL提供了多种数据类型,以满足不同场景的需求。 1. CHAR和VARCHAR:CHAR是定长字符串类型,适合存储固定长度的数据...

Global site tag (gtag.js) - Google Analytics