mysql数据类型详解(1)

优化设计不良或索引不佳的架构能把性能提升几个数量级。如果需要高性能,就必须运行特定的查询设计架构和索引,还要评估不同类型查询的性能要求,因为更改某个查询或架构的一部分会对其他部分造成影响。例如,为了加快数据读取而添加的索引会减慢更新的速度。

选择优化的数据类型

遵循以下原则有助于更好的选择合适的数据类型

更小通常更好

更小的数据类型通常更快,因为他们使用更少的磁盘空间,内存和cpu缓存,而且需要的cpu周期更少

简单就好

越简单的数据类型,需要的cpu周期就越少。例如,比较整数的代价小于比较字符,因为字符集和排序规则使字符更复杂。

尽量避免null

尽可能把字段定义not null,即使应用程序无须保存null,即使表中存储没有值的字段,还是有可能不使用null的,考虑使用0,特殊值或空字符串来代替它。可空列需要更多的存储空间,还需要在mysql内部进行特殊处理。当可空列被索引的时候,每条记录都需要一个额外的字节,还能导致myisam中固定大小的索引变成可变大小的索引。

例如,datetime和timestamp能保存同样类型的数据:日期和时间,精度为秒,然而,timestamp使用的空间只有datetime的一半,还能保存时区,拥有特殊的自动更新能力。而另一方面,它允许的范围小的多,并且在某些时候,它的特殊功能会成为障碍。

整数

整数有两种类型:整数和实数。如果存储整数,可以使用几种整数类型:tinyint,smallint,mediumint,int或bigint,他们分别需要8,16,24,32,64位存储空间。他们的范围为-2(N-1)到2(N-1)-1,这里的n是所需存储空间的位数。

整数类型可选unsigned属性,它表示不允许负数,并大致把正上限提高一倍。例如tinyint unsigned 保存范围为0到255,而不是-127到128。

实数有分数部分。可以使用decimal保存比bigint还大的整数。mysql同时支持精度与非精度类型。

float和double类型支持使用标准的浮点运算进行近似计算。

字符串类型

mysql支持多种字符串类型,每个字符串都有自己的字符串集和排序规则。这会极大的影响性能。

varchar和char类型

varchar可变长度字符串,是使用的最多的字符串类型。它能比固定长度类型占用更少的存储空间,因为它占用了自己需要的空间。可以节约空间,对性能有帮助,然而由于长度是可变的,它们在更新的时候可能会发生变化,这会引起额外的工作。如果行的长度增加并不再合适原始的位置时,具体的行为则会和存储引擎相关。例如,myisam会把行拆开,innodb则可能进行分页。

char是固定长度的。mysql总是为特定数量的字符分配足够的空间,当保存char值的时候,mysql会去掉任何末尾的空格。存储很短的字符串或长度相似的字符串时候很有用。例如,char适合存储用户密码的md5哈希值,它的长度总是一样的。固定长度不容易产生碎片。char(1)字符串对于单字节字符集只会用1个字节,但是varchar(1)则会占用2个字节,因为1个字节用来存储长度信息。

varchar(200)与varchar(5)保存‘hello’,占用的空间都是一样的,那么使用较短的列任何优势吗?

其实有巨大的优势,较大的列会使用更多的内存,因为mysql通常会分配固定大小的内存块来保存值。这对于排序或使用基于内存的临时表尤其不好。

blob和text类型分别以二进制和字符串的形式保存大量数据。

mysql把blob和text当成实体的对象来处理。存储引擎会特别的保存它们。

使用enum代替字符串类型

可以使用enum列代替传统的字符串类型。enum存储65535个不同的字符串。mysql非常紧凑的方式保存了它们,根据列表中值的数量,mysql会把它们压缩到1到2个字节中。mysql内部把每个值都保存为整数,以表示值在列表中的位置,并且保留了一份查找表来表示整数和字符串在表.frm文件中的映射关系。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查...

18010
来自专栏性能与架构

nginx location配置

location在nginx中起着重要作用,对nginx接收到的请求字符串进行处理,如地址定向、数据缓存、应答控制、代理转发等 location语法 locat...

3296
来自专栏C语言及其他语言

Python程序员最常犯的十个错误

来源:编程派 ? 不管是在学习还是工作过程中,人都会犯错。虽然Python的语法简单、灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序...

3137
来自专栏用户2442861的专栏

使用@property

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0...

490
来自专栏web前端教室

一起升级技能,先行者课程学习笔记

-- Js运行之前的那么一瞬间,生成一个活动对象(Active Object),简直AO对象。

764
来自专栏xingoo, 一个梦想做发明家的程序员

const指南

基本词义  意思就就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!  使用方法 const int a=1;//这里定...

18810
来自专栏angularejs学习篇

angularjs学习第九天笔记(指令作用域【隔离作用域】研究)

692
来自专栏NetCore

设计异常解决方案的几点注意事项

“要……”描述的是总要遵循的规范(但特殊情况下,可能需要违反)。 “考虑……”描述的是一般情况下应该遵循的规范,但如果完全理解规范背后的道理,并有很好的理由不遵...

1819
来自专栏企鹅号快讯

【C语言编程锦囊·连载42】scanf函数的返回值是什么?

问题阐述 scanf函数是用于数据输入的,输入变量的值被改变,那么scanf函数本身是否有返回值,返回值是什么意义呢? 专家解答 scanf函数的返回值很少有人...

2118
来自专栏前端说吧

【消灭代办】第一周 - 敏感词判断

  一堆字符串组成的数组,给你一个字符串,让你去查找这个字符串是否在这个数组当中?

771

扫码关注云+社区