学习《高性能MySQL》第4章,读书笔记。

选择数据类型的原则

更小的通常更好

尽量使用可以正确存储数据的最小的数据类型,因为这样会占用更少的磁盘、内存、CPU。

简单就好

简单数据类型的操作需要更少的CPU周期。

尽量避免NULL

当列中包含NULL时,会使得索引、索引统计和值的比较变得复杂。可以添加DEFAULT避免NULL。

整数类型

数据类型

字节数

带符号最小值

带符号最大值

不带符号最小值

不带符号最大值

TINYINT

1

-128

127

0

255

SMALLINT

2

-32768

32767

0

65535

MEDIUMINT

3

-8388608

8388607

0

16777215

INT

4

-2147483648

2147483647

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

0

18446744073709551616

MySLQ可以为整数类型指定宽度,例如INT(11),指定宽度对于值的范围没有影响。

INT(N),N表示的是显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了unsigned zerofill才有效。

create table int_width_test(

a int(5),

b int(5) UNSIGNED,

c int(5) ZEROFILL,

d int(5) UNSIGNED ZEROFILL,

e int(8) UNSIGNED ZEROFILL

) ENGINE=INNODB charset=utf8;

INSERT INTO int_width_test values(1,1,11111111,11111111,11111111);

INSERT INTO int_width_test values(1,1,1,1,1);

复制代码

实数类型

数据类型

字节数

备注

float

4

单精度浮点型

double

8

双精度浮点型

对于float、double有一个比较大的问题就是精度丢失。

原因很简单,其实在MySQL中对对于float类型的数据,只分配了32位的存储空间,对于double类型值分配了64位存储空间。当我们的数据转化为二进制时的存储空间大于32位或者64位,MySQL会将我们存储的数据从高位到低位进行截断。也就是说,当我们存储的空间小于32位或者64位时,数据是准确的,但是当我们存储的数据位数较多时,会出现数据不准确的现象。

对于这个问题,我们可以使用decimal的类型进行解决。

其实decimal可以解决精度丢失的原因:

更大的存储空间

通过字符串化或者其他的方式特殊存储起来

想要深入了解这一方面的读者,可以看我的第二篇参考文献。

字符串类型

CHAR和VARCHAR类型

VARCHAR类型存储可变长度字符串。

实现方式:需要额外的1或2个字节记录字符串的长度,如果长度小于或等于255字节,需要1字节记录。反之,需要2字节。

特点:节省空间,对于性能有帮助。但是需要注意的是,当行的长度变长时,需要进行额外的工作。

当行的长度变长时,MyISAM会将行拆成不同的片段存储,InnoDB需要分裂页使行可以放入内存。

适用场景:字符串的最大长度比平均长度大很多;列的更新很少。

CHAR类型存储定长字符串。

实现方式:MySQL会根据定义分配空间,存储的时候会删除字符串的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。

适用场景:很短的字符串,或所有值都接近一个长度。

BLOB和TEXT类型

BLOB和TEXT类型都是为存储很大的数据而设计的字符串数据类型。

BLOB类型存储的是二进制数据,没有排序规则或字符集。

TEXT类型存储的是字符串,有字符集和排序规则。

MySQL把BLOB和TEXT当作独立的对象处理。当BLOB和TEXT值太大时,InnoDB会使用专门的外部排序存储区域来存储,每个值在行内需要1~4个字节存储一个指针,在外部存储区域内存储实际的值。

当使用BLOB和TEXT列,在遇到使用临时表的情况时,无法使用内存临时表,只能在磁盘上创建临时表。这样会造成严重的性能开销,所以,尽量避免使用BLOB和TEXT类型。

使用枚举(ENUM)代替字符串类型

使用 MySQL ENUM作为列的数据类型

好处:

使得数据更紧凑进而节省空间。

更好的可阅读性。

缺点:

MySQL内部存储的是整数,如果使用数字作为ENUM枚举常量,容易混乱。

枚举字段按照内部存储的整数而不是定义的字符串进行排序。

枚举字段是固定的,添加或者删除字符串必须使用ALTER TABLE。

日期和时间

类型

字节

特征

DATETIME

8

与时区无关,时间范围:1000-01-01 00:00:00 to 9999-12-31 23:59:59

TIMESTAMP

4

与时区有关,时间范围:1970-01-01 00::00:01 to 2038-01-19 03:14:07

通常推荐使用TIMESTAMP,因为它比DATETIME空间效率更高。

参考文献

mysql数据类型符号位_MySQL数据类型相关推荐

  1. mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...

    存储引擎补充: 不同的应用软件处理不同类型的数据 MySQL5.5版本及以上默认的存储引擎为innodb innodb:支持行锁表锁,外键,事物,安全性更高,教myisam数据更安全 myisam:仅 ...

  2. mysql数据类型默认长度_mysql数据类型长度

    1个字节= 8位  tinyint 为一个字节  2的8次方= 256 所以最多存储到256 日期和时间数据类型 MySQL数据类型 含义 date 3字节,日期,格式:2014-09-18 time ...

  3. mysql数据类型的验证_MYSQL数据类型详解

    无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构.充分利用空间是十分必要的.这就要求我们对数据库系统的常用数据类型有充分的认识.下面我就将我的一点心得写出来跟大家分享. 一.数字 ...

  4. mysql 体重 类型 身高_MySQL 数据类型

    介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 mysql常用数据类型概括: #1. 数字: 整型:tinyint int bigint 小 ...

  5. mysql字段类型原理_mysql数据类型和字段属性原理与用法详解

    本文实例讲述了mysql数据类型和字段属性.分享给大家供大家参考,具体如下: 本文内容: 数据类型 数值类型 整数型 浮点型 定点型 日期时间类型 字符串类型 补充: 显示宽度与zerofll 记录长 ...

  6. mysql blob取值_MySQL 数据类型:

    MySQL 数据类型: 字符型 数值型 日期时间型 内建类型 字符型: CHAR, BINARY:定长数据类型: VARCHAR, VARBINARY:变长数据类型:需要结束符: TEXT:TINYT ...

  7. mysql 地理空间支持_MySQL数据类型-地理空间数据类型

    1.MySQL地理空间数据类型 POINT,存储一个位置点数据 LINESTRING,存储一条线数据 POLYGON,存储一个多边形数据 MULTIPOINT,存储多个位置点数据 MULTILINES ...

  8. mysql数据类型默认值_MySQL数据类型 - 数据类型默认值

    数据类型默认值 数据类型规范可以有显式或隐式的默认值. 数据类型规范中的DEFAULT值子句显式指示列的默认值.示例: SERIAL DEFAULT VALUE是一种特殊情况.在整数列的定义中,它是N ...

  9. int mysql是什么意思_MySQL数据类型 int什么意思

    MySQL数据类型 int什么意思 关注:136  答案:2  mip版 解决时间 2021-01-30 21:51 提问者叫我女王 2021-01-30 10:52 MySQL数据类型 int什么意 ...

最新文章

  1. 独家 | 一文为你解析神经网络(附实例、公式)
  2. PAT 1052. Linked List Sorting
  3. 2021全年“遇冷”后,“电商节”该何去何从?
  4. 构建制品不一致,后续工作都是白费 | 研发效能提升36计
  5. 同时运行两个PHP吗,PHP-避免由两个工作人员同时运行后台作业
  6. java smslib rxtx_短信猫java二次开发包源代码smslib-3.5.4.jar
  7. [转]WiX v3.7——支持MSBuild、自更新及引用计数
  8. 【无标题】曲线坐标张量分析
  9. rpa操作excel_一文看懂RPA与Excel宏的区别
  10. 微信小游戏接入遇到的坑
  11. Word中的公式编辑器插入自动编号公式时,隐藏必要的分章节字符串的办法
  12. 《海外社交媒体营销》一一第1章 电商创业起步
  13. 如何将图片转换成字符画
  14. springboot项目:家庭整理服务管理系统39774(java+VUE+Mybatis+Maven+Mysql)
  15. Docker上部署SpringBoot项目并推送镜像到Docker Hub上---以MacOS为例
  16. 希望所有程序员的世界里,永远没有BUG
  17. 数据分析36计(21):Uber、Netflix 常用倍差法模型量化营销活动、产品改版影响效果...
  18. 10000首好听的歌 qq空间背景音乐 听完不想别的歌
  19. 不用栈实现二叉树非递归中序遍历
  20. Netty谈谈ByteBuf

热门文章

  1. 很实用的 “设为首页”与“加入收藏”代码
  2. Dataguard failover切换应用redo操作
  3. Scapy脚本执行出现警告WARNING解决办法
  4. 编写高效Excel VBA代码的最佳实践(一)
  5. 【Spring源码】Spring中的AOP底层原理分析
  6. 鲜为人知的pandas骚操作
  7. 特来电CMDB应用实践
  8. Python发行版本Anaconda的安装说明:基于Anaconda2-4.3.1-Windows-x86_64
  9. learnpythonthehardway EX41 相关
  10. 1 创建数据库连接对象 IDbConnection