1.选择优化的数据类型的标准

  1)更小的通常更好。

  一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。

  2)简单就好

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

  3)尽量避免NULL

  许多表都包含可为NULL(空值)的列,记事应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。通常情况下,最好制定列为NOT NULL,除非真的需要存储NULL。

  2.基本的数据类型

  1)整数类型

  TINYINT(8位存储空间)、SMALLINT(16位存储空间)、MEDIUMINT(24位存储空间)、INT(32位存储空间)、BIGINT(63位存储空间),对应的值的存储范围为-2N-1至2N-1-1,其中N是存储空间的位数。

  整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使证书的上限提高一倍。例如:TINYINT可以存储的范围是0~255,而TINYINT存储的范围是-128~127。      有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。

  你的选择决定了MySQL怎样在内存和磁盘中存储数据。然而整数据算一般使用64位的BIGINT整数,即使在32位的环境也是如此。一些聚合函数是例外,他们使用DECIMAL(DECIMAL不属于浮点数类型,可以在定义时划定整数部份以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分比使用decimal(4,2)即可。存储数据范围是:-10^38~10^38-1 的固定精度和小数位的数字。一个decimal类型的数据占用了2~17个字节。)或者DOUBLE进行计算。

  MySQL可以为整数类型指定宽度,例如:INT(11),但是这对大多数应用是没有意义的。他不会限制指的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。

  2)实数类型

  DECIMAL、FLOAT(4字节存储)、DOUBLE(8字节存储)

  DECIMAL可以用来存储比BIGINT还大的整数。DECIMAL用来存储精确的小数。在MySQL5.0和更高版本,DECIMAL支持精确计算。MySQL以及更早的版本使用浮点运算实现DECIMAL的计算。这样会因为精度损失导致一些奇怪的结果。

因为CPU不支持DECIMAL直接运算,所以在MySQL5.0和更高版本中,Mysql服务器自身实现了DECIMAL的高精度计算。相对而言,CPU直接支持原生浮点计算,所以浮点运算明显更快。

  浮点和DECIMAL都可以指定精度。对于DECIMAL列,可以指定小数点前后所云寻得最大位数。这会影响列的空间消耗。MySQL5.0和更高版本将数字打包和保存到一个二进制字符串中(每四个字街存9个数字)。例如:DECIMAL(18,9)小数点左右两边都将存储9个数字,共九个字节:小数点前数字用四个字节,小数点后数字用四个字节,小数点本身一个字节。

  在MySQL5.0和更高版本中,DECIMAL最多允许65个数字,而早期的版本中是254个数字,并且保存为未压缩的字符串(每个数字一个字节)。然而并不能在计算中使用这么大的数字,因为DECIMAL只是一种存储格式,在计算中会转化为DOUBLE类型。

  3)字符串类型

  varchar(变长)、char(定长)、binary、varbinary、blob(二进制方式存储)、text(字符串方式存储)

  varchar类型用于存储变长字符串,他必定长更节省空间,因为他仅使用必要的空间。有一种情况例外,如果MySql表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长的存储,这会很浪费空间。

  varchar需要使用一个或者两个额外的字节记录字符串的长度:如果列的最大长度小于或等于255字节,则使用一个字节表示。否则使用两个字节。

  varchar节省了空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时,可能使行变得比原来更长,这就需要做额外的工作。不同存储引擎处理不同。

  有如下几个适合使用varchar的情景:

    字符串列的最大长度比平均长度大很多;

    列的更新很少,所以碎片不是问题。

    使用了像UTF-8这样复杂的字符集,每个字符都是用不同的字节数进行存储。

  char的类型是定长的,当存储CHAR值时,MySql会删除末尾所有的空格。(在MySql4.1和更老的版本中,varchar也是这样实现。也就是说,在这些版本中,char和varchar在逻辑上是一样的,区别只是在存储格式上)。char值会根据需要采用空格进行填充以方便比较。

  适合使用char的情景:

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

    对于经常变更的数据,char也比varchar更好,因为char不容易产生碎片。

    对于非常短的咧,char比varchar在存储空间上也更有效率。varchar需要额外字节存储长度。

  与char和varchar类似的还有binary和varbinary,他们存储的是二进制字符串。二进制字符串与常规字符串类似,但是二进制字符串存储的是字节码,而不是字符。填充也不一样:MySql填充binary采用的是\0(零字节),而不是空格。在检索是也不会去掉填充值。

  blob和text都是为了存储很大的数据类型而设计的字符串数据类型。实际上,他们份数量组不同的数据类型家族:字符类型是TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT,对应的二进制类型是TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB。BLOB是SMALLBLOB的同义词,TEXT是SMALLTEXT的同义词。

  MySql会把每个BLOB和TEXT当做一个独立的对象处理。存储引擎在存储时,通常会做特殊处理。BLOB和TEXT家族之间仅有的不同是:BLOB类型存储的是二进制数据,没有排序规则或者字符集,而TEXT类型有字符集和排序规则。

  4)日期和时间类型

  DATETIME、TIMESTAMP  

  MySql能存储的最小时间粒度为秒(MariaDB支持微妙级别的时间类型)。但是MySql可以使用微秒级的粒度进行临时运算。

  DATETIME,精度秒,8字节存储空间,范围1001年~9999年,值与时区无关。

  TIMESTAMP,显示的值依赖于时区,4字节存储空间,存储范围1970年~2038年,插入时未指定值,则默认为当前时间。MySql提供FROM_UNIXTOME()将UNIX时间戳转化为日期, UNIX_TIMESTAMP()将日期转化为UNIX时间戳。

  除了特殊行为之外,应该尽可能使用TIMESTAMP类型,因为它比DATETIME空间效率更高。有时候会将UNIX时间戳存储为整数值,这不会带来任何收益。用整数存储时间戳的格式通常不方便处理。

  如果要存储比秒更小的粒度,可以使用BIGINT存储微秒级别的时间戳,或者使用DOUBLE存储秒之后的小数部分。也可以使用MariaDB代替MySql。

  5)特殊数据类型

  某些类型的数据并不直接与内置的类型一致。地狱喵机精度的时间戳就是一个例子。另一个例子是IPv4地址,经常使用varchar(15)来存储IP地址,然而,它实际上是32位无符号整数,不是字符串。小数点讲地址分成四段的表示方法只是为了让人们容易阅读。所以应该使用无符号整数来存储IP地址。MySql提供了INET_ATON()和INET_NTOA()函数在这两种表示方法之间进行转换。

MySQL的基本数据类型与数据类型优化的更多相关文章

  1. MySQL数据库笔记二:数据类型及数据库操作

    三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...

  2. MySQL入门(引擎、数据类型、约束)

    MySQL入门(二) 表的引擎:驱动数据的方式 - 数据库优化 # 概要:引擎是建表规定的,提供给表使用,不是数据库的 # 展示所有引擎 show engines; # innodb(默认): 支持事 ...

  3. MySQL入门(3)——数据类型

    MySQL入门(3)--数据类型 数字类型 整数数据类型: 数据类型 取值范围 说明 单位 TINYINT 符号值:-127~127无符号值:0~255 最小的整数 1字节 BIT 符号值:-127~ ...

  4. MySQL基础(1) | 数据类型

    MySQL基础(1) | 数据类型 数值类型 TINYINT #小整数值,1 字节,有符号(-128,127),无符号(0,255) SMALLINT #大整数值,2 字节 MEDIUMINT #大整 ...

  5. MySql Oracle SqlServer 数据库的数据类型列表

    Oracle数据类型 一.概述  在ORACLE8中定义了:标量(SCALAR).复合(COMPOSITE).引用(REFERENCE)和LOB四种数据类型,下面详细介绍它们的特性. 二.标量(SCA ...

  6. 第 9 章 MySQL数据库Schema设计的性能优化

    前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只 ...

  7. MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

    第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...

  8. MySql(八):MySQL性能调优——Query 的优化

    一.理解MySQL的Query Optimizer MySQL Optimizer是一个专门负责优化SELECT 语句的优化器模块,它主要的功能就是通过计算分析系统中收集的各种统计信息,为客户端请求的 ...

  9. Mysql数据库调优和性能优化

    1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开源数据库,但是mysql数据库的默认设置性能非常 ...

  10. Mysql数据库调优和性能优化的21条最佳实践

    Mysql数据库调优和性能优化的21条最佳实践 1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开 ...

随机推荐

  1. GitHub项目协作基本步骤

    1.查找某个项目,然后Fork 2.打开GitHub For Windows,发现刚才Fork的项目 3.对着项目点击Clone,将之复制至本地 4.使用Eclipse等进行开发,如新增一个文件 5. ...

  2. project euler 12 Highly divisible triangular number

    Highly divisible triangular number Problem 12 The sequence of triangle numbers is generated by addin ...

  3. c#一个分页控件的例子

    一.首先下载一个dll,地址:http://pan.baidu.com/share/link?shareid=1628211605&uk=1342867987 二.添加到项目中 三.添加引用 ...

  4. css清除浮动解决方案

    清除浮动包括清除子元素的浮动和清除上级元素的浮动,其中清除上级元素的浮动,只需设置clear为both就可以了,而清除子元素的浮动则可以用空标签法.clearfix方法或overflow方法.因清除上 ...

  5. (转)使用scp命令在linux操作系统之间传递文件

    一.关于scp scp是英文secure copy (remote file copy program)的简称,主要用于在两台主机之间通过网络拷贝文件.scp使用ssh协议进行数据传递,其认证方式和安 ...

  6. USB class总结

    以下是总结的USB的类,不同的USB类,主机询问的描述符格式和内容都不一样,具体的descriptor的内容可以查看 USB spec(http://www.usb.org/home/),如HID的s ...

  7. mac安装GNU命令行工具

    mac安装GNU命令行工具 2.添加的repo     tap home/dupes        brew install coreutils  binutils  diffutils  ed -- ...

  8. 64位Win7安装+32位Oracle + PL/SQL 解决方法

    软件景象:64位win7.32位Oracle 10g. PL/SQL 9.0.4.1644 媒介:以前开辟用的都是32位体系,忽然换到64位上,安装景象真的有点麻烦了,尤其对于PL/SQL只支撑32位 ...

  9. Red and Black(BFS or DFS) 分类: dfs bfs 2015-07-05 22:52 2人阅读 评论(0) 收藏

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  10. tr转换或删除字符

    字符处理命令:tr —— 转换或删除字符 逐个字符处理而不是处理单词的tr [OPTION]... SET1 [SET2]    -d: 删除出现在字符集中的所有字符 tr ab AB