在数据库设计的时候,如果数据类型选择不当,可能会对性能造成很大的影响,比如存储姓名的字段,如果选择VCHAR(255),那么暂用更多的存储空间,同时也会对IO产生影响,因此在数据库设计时对数据库数据类型的准确选择,也会对数据库的性能有一个很大的提升。我在工作中就遇到过很多时候一些开发人员不注意对数据类型认真选择,而是只要能存储下数据就可以,例如,使用VARCHAR(100)类型存储姓名字段,用VARCHAR(10)类型存储日期等等。如果使用的是MySQL的InnoDB存储引擎,那么每个数据页的大小是16K,如果选择的数据类型占用的存储空间过大,那么加载同样的数据所需要的数据页也就越多,处理越多的数据页所需要的IO就越多,因此性能也就越低。
整数类型
在MySQL数据库中提供了以下几种整数类型,以及他们所占用的空间和取值范围
tinyint 1字节 -128~127
smallint 2字节 -32768~32767
mediumint 3字节 -8388608~8388657
int 4字节 -2147483648~2147483647
bigint 8字节 -9223372036854775808~9223372036854775807
在实际应用过程中,根据你的业务要求,选择合适的整数类型,比如,我曾经见到有人在数据库中设置一个标识为,标识客户的还款状态,使用的类型是int,其实简单来说还款了设置1,未还款设置为2(实际情况不只两种情况)。那么完全应该使用tinyint类型,而不是使用int类型。
有时候有人可能会使用int(2)来定义数据类型,以为这样只会占用两个自己,其实不是,MySQL数据库还是会使用4个字节来存储数据。
实数类型
FLOAT 4字节 非精确
DOUBLE 8字节 非精确
DECIMAL 每4个字节存储9个数字,小数点占一个字节 精确
在财务类或者金融类相关的系统中,一定要使用DECIMAL类型来存储资金相关的数据,否则大额资金运算会产生偏差。
字符串类型
在MySQL中经常使用VARCHAR或CHAR来存储字符串类型数据,VARCHAR类型用于存储变长字符串,只占用必要的存储空间,而CHAR类型是定长的,最大长度是255个字符。需要注意的是,MySQL中定义字符串长度的单位是字符而不是字节,这与一些编程语言不通,比如:存储10个汉字的数据类型,就应该定义成VARCHAR(10)或CHAR(10)。有人可能会问,既然VARCHAR类型是可变长度,而且只占用必要的存储空间,那么定义类型的时候可以将字符串宽度定义的大一些,也不会有什么影响。其实不是这样,MySQL数据库会对SQL语句进行查询优化,在处理查询优化的时候MySQL会使用固定长度的内存存储数据,因此定义的字符串宽度越大,所需要的存储空间就越大,从而降低性能。
VARCHAR类型适用以下场景:
1.字符串列的最大长度比平均长度大很多;
2.字符串列很少更新,如果字符串列更新频繁,使用varchar类型会造成存储碎片;
3.使用了多字字节字符集存储字符串,比如UTF-8,实际上我们在平时基本上都会把数据库和存储引擎字符集定义为UTF-8,这时候如果存储的字符串中既有中文又有英文或数据,建议考虑使用VARCHAR
CHAR类型适用的场景:
1.存储的字符串长度近似,比如身份证号、手机号、MD5等;
2.适合存储短字符串;
3.适合存储更新频繁的字符串,使用CHAR类型可以减少存储碎片。
日期类型
在我的工作中,见过很多使用字符串类型存储日期和时间的情况,千万不要这么做,第一使用字符串存储日期时间类型并不能节省空间,相反往往会浪费空间,第二在进行时间和日期计算时很麻烦。唯一我能想到的好处就是在编程的时候不用进行字符串转换了。
在MySQL中定义日期和时间的数据类型有以下几种
DATETIME类型:存储日期和时间,格式为:YYYY-MM-DD HH:MM:SS。好像是在MySQL5.6之前DATETIME类型的数据只能精确到秒,在MySQL5.6之后,可以使用datetime(6)来存储微秒。DATETIME类型占用8个字节,可以存储公元1000-01-01到9999-12-31的时间。DATETIME类型是与时区无关的,也就是说你的数据库迁移到了美国,改了时区,时间也不会发生变化。
TIMESTAMP类型:我在工作中喜欢使用这种类型定义时间,TIMESTAMP类型占用4个字节(其实就是一个int),可以存储从1970年1月1日到2037年12月31日这段时间内的秒数,TIMESTAMP类型是与时区相关的,当改变时区时,TIMESTAMP类型的日期就会跟着改变。TIMESTAMP日期类型还有一个常用的功能就是每当更新一行数据,本行中的TIMESTAMP数据就会自动更新为更新时间,这是一个很实用的特性。注意默认情况下,如果一行数据有多个TIMESTAMP类型,那么更新的时候只会更新第一个TIMESTAMP类型数据,可以通过建表语句指定你希望在数据行更新时那个TIMESTAMP类型的数据需要自动修改。
DATE类型:经常用来存储出生日期等只需要精确到天的数据,占用3个字节。
TIME类型:用于存储时间,格式为HH:MM:SS
打开App,阅读手记