高性能MySQL--MySQL数据类型介绍和最优数据类型选择
MySQL支持的数据类型很多,那么选择合适的数据类型对于获得高性能就至关重要。那么就先了解各种类型的优缺点!
一、类型介绍
1、整型类型
整型类型有: TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 。他们分别占8,16,24,32,64位储存空间。可存储的整数范围为-2^(N-1)到2^(N-1)-1,其中N是存储空间的位数。
还可以将整数类型设为 UNSIGNED ,这样几乎可以是其范围增大一倍。例如TINYINT范围是-128 - 127,而TINYINT UNSIGNED的范围是0-255。不过这两种只是在范围上有缺别,在存储空间和性能上都是一样的。
2、实数类型
对于实数类型,MySQL即支持精确类型(DECIMAL),也支持不精确类型(FLOAT,DOUBLE)。
DECIMAL类型允许最多存储65位数字,因此它可以存储比BIGINT还大的数字。而且在MySQL5.0或更高版本中,MySQL服务器自身实现的DECIMAL的高精度计算。但相比较浮点类型,因为CPU直接支持原声浮点计算,所以浮点类型计算会更快。
通常来说,浮点类型在存储相同的范围时,比DECIMAL使用更少的空间。FLOAT占用4个字节存储,DOUBLE占用8个字节存储,但相比FLOAT有更高的精度和更大的范围。浮点类型存储时在精度上会有各种各样的问题,例如当你只把一列设为FLOAT,而没有指定精度时,在存储1234567.33会变成1234570。
DECIMAL所占的字节比较特殊。它是在小数点前后分别使用每4个字节存储9位数字。具体看mysql手册说法:
所以我们使用最多的DECIMAL(10,2)所占的字节数为1+4+1+1=7个字节(小数点占一个字节)。
因为需要额外的计算开销和存储空间,所以应该尽量只在对小数进行精确计算时才使用DECIMAL--例如存储财务数据。当你的数据量比较大的时候,为了避免浮点存储计算不精确和DECIMAL精确计算代价高的问题,可以使用BIGINT代替DECIMAL,只需将原来需要存储的小数乘以相应的倍数即可(BIGINT的范围满足你的需求)。
3、字符串类型
VARCHAR类型用于存储可变长的字符串,所以它需要1或2个额外的字节记录字符串的长度:如果列的长度小于或等于255个字节,则只使用1个字节表示,否则使用2个字节表示。例如varchar(10)就需要11个字节,varchar(1000)则需要1002个字节。
VARCHAR节省了存储空间,所以对性能有所帮助。但由于行是变长的,在UPDATE时可能是原来的行更长,这就会导致需要做一些额外的工作。如果一个行占用的空间曾长,并且在页内没有更多的空间可以存储,这是INNODB就会分裂当前页来使行可以放进页内。
下面这些情况使用VARCHAR是合适的:
- 字符串列的最大长度比平均长度大很多
- 列的更新很少
- 使用了UTF-8这样的字符集,每个字符都是用不同的字节存储
CHAR类型是定长的:MySQL总是根据定义字符串的长度分配足够空间。因为CHAR会根据需要采用空格填充到字符串末尾,而且当你检索时,CHAR会删除末尾的空格。所以会有一个很有趣的事情发生,当你存储一个"Johnson "到char(10)时,检索出来的结果却是"Johnson",因为MySQL并不知道这空格是你存的还是系统自动填充的。
CHAR很适合存储很短的字符串或所有值都接近同一个长度。例如密码的MD5值。
BLOB和TEXT都是为了存储很大的数据类型而设计的字符串数据类型,分别采用二进制和字符方式存储。而且当它们存储的数据过大时,INNOSB会使用专门的‘外部’空间来存储数据,此时每个值的行内仅存储一个1 ~ 4个字节的指针,然后在外部区域存储真实的指。当需要对BLOB和TEXT排序时,它只对每个列的最前 max_sort_length 进行排序。这个值是可以配置的。
4、 枚举类型
有时候可以使用枚举类型代替常用的字符串类型。MySQL在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”的映射关系。比如性别列,就可以用enum(男,女,未知),这里有些人可能用TINYINT代替枚举,实际我感觉这并不能带来性能的优化,只不过你把“数字-字符串”的映射关系搬到你的业务逻辑中处理,如果你的注释写的不清晰,反而会给新人带来困惑。
对于弱类型语言来说,枚举并不是狠友好。举个栗子:select id,name from users where id = ; 和 select id,name from users where id = ‘1’; 得到的结果是一样的。因为ENUM内部存储是用的整型,所以在检索ENUM类型时也可以用整数,例如 select id,name from users where sex = ; 和 select id,name from users where sex = '男'; 可以得到相同的结果。但
select id,name from users where sex = ‘1’;
就检索不到任何值。但如果你设计和使用的好,依然可以用。
5、日期和时间类型
日期和时间类型共有:DATE、TIME、YEAR、DATETIME和TIMESTAMP。其中DATE、TIME、YEAR分别占4,3,1字节,并且存储的时间格式为YYYY-MM-DD,HH:MM:SS,YYYY。这三种日期和时间类型相对用的比较少。这里主要介绍DATETIME和TIMESTAMP的区别。
DATETIME存储的范围大,从1001到9999年,精度为秒,存储格式为YYYY-MM-DD HH:MM:SS,占8个字节的存储空间。
TIMESTAMP存的范围要小很多,从1970年到2038年(快超出范围了),精度为秒,存储格式也为YYYY-MM-DD HH:MM:SS,但只占4个字节的存储空间。TIMESTAMP默认为NOT NULL,并且当插入时没有指定该列值时,会默认把MySQL当前时间插入进去。除了特殊行为,否则应该尽量使用TIMESTAMP,因为它比DATETIME占更少的存储空间。
这里要特殊说明的是,有时候有的人会将Unix时间戳存储为整数(我们公司就是这么干滴),但这不会带来任何收益。反而用整数保存时间戳的格式通常不方便处理,所以不推荐这样做。
二、选择优化的数据类型
- 更小的更长更好
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。例如只需要存0~200的值,显然TINYINT UNSIGNED就足够了。更小的数据类型更快,因为它们占用更少的磁盘、内存和CPU,并且处理时需要的CPU周期也更少。
- 简单就好
简单的数据类型的操作通常需要更少的CPU周期。例如应该用整型存储IP而不是字符串。
- 尽量避免NULL
可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊的处理。但可为NULL的列被索引时,每个索引记录需要一个额外的字节。
高性能MySQL--MySQL数据类型介绍和最优数据类型选择的更多相关文章
- mysql数据类型介绍
一.int.bigint.smallint 和 tinyint的区别详细介绍 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854 ...
- MySQL:数据类型介绍
数据类型介绍 一.整数类型(可以添加自增约束条件) 数据类型 存储需要 有符号 无符号 tinyint 1个字节 -2^7~2^7-1 0~2^8 smallint 2个字节 -2^15~2^15-1 ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- MySQL常用函数介绍
MySQL常用函数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作符介绍 1>.操作符优先级 mysql; +----------+ | +----------+ ...
- {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用
MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...
- MySQL慢查询查找和调优测试
MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下.本文参考自:http://www.jbxue.com/db/4376.html 编辑 my.cnf或者my.ini文件,去除 ...
- MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎
文章目录 Mysql逻辑架构介绍 总体概览 总体概览 mysql存储引擎 查看命令 看你的 mysql 现在已提供什么存储引擎 : 看你的 mysql 当前默认的存储引擎 : 各个引擎简介 MyISA ...
随机推荐
- Rabbitmq安装报错 Windows下安装RabbitMQ报错Error: unable to connect to node rabbit@xxx: nodedown
1..erlang.cookie文件不一致 如果是Windows 64位系统两个文件都要修改,另外当C:\Users\用户\.erlang.cookie没有修改权限的时候 用上面这个文件覆盖下面两个目 ...
- fiddler抓包出现Tunnel to
在抓包的时候,有时候会遇到很多的tunnel to,图标是一把锁的形状,如下图: connect是为了建立http tunnel,connect是http众多方法中的其中一种,它跟post.get.p ...
- C# winform Visual Studio Installer打包教程
C# winform Visual Studio Installer打包教程 软件在功能开发实现后,其实并没有真正的完成.对于一个专业的开发者来说,Release软件应该是以安装版本的形式进行发布的 ...
- 使用HVTableView动态展开tableView中的cell
使用HVTableView动态展开tableView中的cell 效果: 源码: HVTableView.h 与 HVTableView.m // // HVTableView.h // HRVTab ...
- delete in javascript
Key word delete. 1. Delete global object. x = 42; // creates the property x on the global object var ...
- React学习笔记(六)事件处理
React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...
- zbrush书法文字硬边雕刻
方法的重点在与边缘环的操作以及模型网格的数量. 1.通过ZAppLink功能可以把制作的文字书法映射到模型上去. 2.遮罩,按照颜色强度遮罩. 3.分组,按照颜色分组.单独显示文字部分的分组.按Ctr ...
- memcached的操作
memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态.数据库驱动网站的速度.memcached基于 ...
- less使用总结
15年自学了 less ,可是一直没用,就忘记了.后来抱着提高 css 开发速度的目的,又去学习了 less ,学完马上用,效果立竿见影,记得也牢了.刚开始学习前,我们总会问自己一个问题,学习它有什么 ...
- 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法
1. 内部拦截法: 父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理. 这种方法和Android中的事件分发机制不一样,需要配合request ...