mysql中gender要用什么类型,如何选择合适的MySQL数据类型

1、MySQL数据类型选择原则

更小的一般更好:通常状况下选择能够正确存储数据的最小数据类型。越小的数据类型一般更快,占用磁盘,内存和CPU缓存更小。算法

简单就好:简单的数据类型的操做一般须要更少的CPU周期。例如:整型比字符操做代价要小得多,由于字符集和校对规则(排序规则)使字符比整型比较更加复杂。sql

尽可能避免NULL:尽可能制定列为NOT NULL,除非真的须要NULL类型的值。由于可能为NULL列使得索引,索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也须要特殊处理。数据库

2、选择具体数据类型

在选择列的数据类型时须要先选定合适的大类型,如:数字,字符串,时间等。编程

(1)、整数类型缓存

数据类型

长度/字节

范围

TINYINT

1

-2^7—2^7-1

SMALLINT

2

-2^15—2^15-1

MEDIUMINT

3

-2^23—2^23-1

INT

4

-2^31—2^31-1

BIGINT

8

-2^64—2^64-1

区分开TINYINT / INT / BIGINT,能肯定不会使用负数的字段,建议添加 unsigned定义。服务器

可以用数字类型的字段尽可能选择数字类型而不用字符串类型。编程语言

(2)、实数类型函数

实数是带有小数部分的数字。然而它们不仅是存储小数部分;也能够是DECIMAL存储比BIGINT还大的整数。MYSQL即支持精确类型,也支持非精确存储。FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。具体计算规则取决于所使用平台的实现。post

数据类型

长度/字节

范围

FLOAT

4

DOUBLE

8

DECIMAL

最多65数字(5.0以上版本)

MySQL使用DOUBLE做为内部浮点计算的类型。注意,DECIMAL须要额外的空间和计算开销,因此只要要求尽可能对小数进行精确时才使用DECIMAL,例如在存储财务数据时,能够用BIGINT来替代它来实现,只须要将数据乘以相应的倍数便可。性能

FLOAT和DOUBLE选择(尽可能选择FLOAT)

如何有涉及到运算,用float和double可能会精度不许,能够考虑将小数乘于相应的倍数,而后用BIGINT来存储。

(3)、字符串类型

MySQL支持多种字符串类型。从4.1版本开始,每一个字符串列能够定义本身的字符集和校对规则(排序规则),这些东西会在很大程度上影响性能。

一、VARCHAR和CHAR类型

VARCHAR和CHAR时最主要的两种字符串类型。

VARCHAR:适用于存储变长的字符串,是最多见的字符串数据类型。它比定长更加节省空间,由于它仅须要使用必要的额外空间(若是MySQL表使用ROW_FORMAT=FIXED建立的话,会使用定长)。

适合使用该类型的状况:字符串列的最大长度比平均长度大不少;列的更新不多,因此碎片不是问题;使用了UTF-8这样复杂的字符集,每一个字符的使用不一样字节数进行存储。

注:5.0以上版本会保留末尾空格,更早的版本会删除末尾空格。InnoDB存储引擎会把过长的VARCHAR转换为BLOB类型。

CHAR:CHAR是定长字符串类型,MySQL老是根据定义的类型进行分配足够的空间。当存储CHAR时MySQL会默认删除行尾空格。由于CHAR值一般须要用空格进行填充以方便比较。

CHAR适合存储很短的字符串,或者全部长度都接近一个长度。

对于常常变动的数据CHAR比较VARCHAR要好,由于定长的CHAR类型不容易产生碎片。

对于更短的列CHAR比VARCHAR要更加节省空间,由于VARCHAR老是须要一个额外的字节来存储长度。

二、BLOB和TEXT类型

BLOB和TEXT是用来存储很大的数据来设计的字符串数据类型,分别采用二进制和字符方式进行存储。

实际上他们时属于两种不一样数据类型家族:字符类型的时TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT;对应的二进制类型是TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB。

BLOB和TEXT的仅有的区别在于BLOB类型存储的时二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则。

char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用 CHAR 类型(填空格),不定长字段尽可能使用 VARCHAR(自动适应长度,超过阶段),且仅仅设定适当的最大长度。

(4)、日期和时间类型

MySQL可使用不少类型来保存日期和时间值,例如YEAR和DATE.MySQL能存储最小粒度为秒。可是可使用微秒级的力度进行运算。

一、DATETIME

能保存1001到9999年,精度为秒。格式为YYYY-MM-DD HH:MM:SS与时区无关,使用八个字节的存储空间。

二、TIMESTAMP

时间戳,正如名字同样。它能保存从1970年1月1号午夜(格林尼治标准时间)。它只使用四个字节的存储空间只能表示1970到2038年。

TIMESTAMP显示的值依赖于时区。MYSQL服务器,操做系统,以及客户端链接都有时区设置。所以存储值为0时在不一样的时区显示值会有差异。

注:一般状况下应尽可能使用TIMESTAMP,由于它比DATETIME效率更高。若是须要存储更小粒度的时间,能够用BIGINGT或者转换成DOUBLE类型来进行存储。

(5)、ENUM数据类型

枚举数据类型在内存中很是紧凑,会根据列表值的数量压缩到一个或两个字节。MySQL自身会维护一个查找表。例如:

CREATE TABLE enum_test(

`gender` ENUM("男","女","其余") NOT NULL

);

INSERT INTO enum_test values("男"),("女"),("其余");

对于状态字段,能够尝试使用 ENUM 来存放。

避免使用NULL字段,很难查询优化且占用额外索引空间。

****************************************************华丽的分割线**************************************************************

一。char和varchar

char是固定长度的,查询速度比varchar速度快的多。char的缺点是浪费存储空间。

检索char列时,返回的结果会删除尾部空格,因此程序须要对为空格进行处理。

对于长度变化不大且对查询速度有较高要求的数据能够考虑使用char。

随着MySQL的不断升级,varchar的性能不断改进并提升。

存储引擎使用原则:

MyISAM:建议使用固定长度列代替可变长度列。

InnoDB:建议使用varchar类型

二。text和blob

在保存大文本时,一般选择text或者blob。

两者的差异是blob能够保存二进制数据,好比照片。

text和blob又包括text、mediumtext、longtext和blob、mediumblob、longblob,他们之间的区别是存储文本长度不一样和存储字节不一样。

应根据状况选择知足需求的最小存储类型。

1.blob和text执行大量删除操做时,产生数据“空洞”

6b16f7fce9ae02f79f591b210c5746a6.png

删除id为7记录先后数据库所占内存,没有发生变化。

d6fa6f311a158c7f739a39e5c2d68a2a.png

b7865facdcf295900dd2cca5c99e4d46.png

能够发现数据文件并无由于数据删除而减小。

对表进行optimize(优化)操做:

optimize table t1;

3e6500c42107d3e210449378ff52c02f.png

能够发现表数据文件大大缩小,“空洞”空间已经被回收。

2.用合成(Synthetic)索引提升查询性能

根据大文本字段(text、blob)的内容创建一个散列值,并把这个值存储在单独的数据列中,而后经过散列值找数据行。

缺点:只能进行精确查询(=范围操做符是没有用处的)

能够经过MySQL自带函数md5()、sha1()、crc32()生成散列值,也能够经过编程语言计算散列值。

注:若是散列算法生成的字符串带有尾部空格,不要把他们存储在char、varchar列中,他们会受到尾部空格去除的影响。

cbe501e5a57e2c90a9386e9a59c54089.png

若是须要对blob或clob字段进行模糊查询,能够用前缀索引:

合成索引只能用于精确匹配,在必定程度上减小了I/O,从而提升了查询效率。

3.在没必要要的时候避免检索大型的blob或text值。

4.把blob或text列分离到单独的表中。

3、浮点数和定点数

1.浮点数存在偏差问题。

2.对货币等对精度敏感的数据,应该用定点数表示或存储。

3.在编程中,若是用到浮点数,要特别注意偏差问题,并尽可能避免作浮点数比较。

4.要注意一些特殊值的处理。

4、日期类型的选择

1.根据实际须要选择可以知足应用的最小存储日期类型。

2.若是记录年月日时分秒,而且记录年份比较久远,最好使用datetime,不要使用timestamp。

3.若是记录的日期须要让不一样时区的用户使用,最好使用timestamp,由于日期类型中只有它可以和实际时区相对应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值