mysql中gender要⽤什么类型,如何选择合适的MySQL数据类
⼀、MySQL数据类型选择原则
更⼩的通常更好:⼀般情况下选择可以正确存储数据的最⼩数据类型。越⼩的数据类型通常更快,占⽤磁盘,内存和CPU缓存更⼩。
简单就好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型⽐字符操作代价要⼩得多,因为字符集和校对规则(排序规则)使字符⽐整型⽐较更加复杂。
尽量避免NULL:尽量制定列为NOT NULL,除⾮真的需要NULL类型的值。因为可能为NULL列使得索引,索引统计和值⽐较都更复杂。可为NULL的列会使⽤更多的存储空间,在MySQL⾥也需要特殊处理。
⼆、选择具体数据类型
在选择列的数据类型时需要先选定合适的⼤类型,如:数字,字符串,时间等。
(1)、整数类型
数据类型
长度/字节
范围
TINYINT
1
-2^7—2^7-1
SMALLINT
2
-2^15—2^15-1
MEDIUMINT
3
-mysql创建表数据类型
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类型⽀持使⽤标准的浮点运算进⾏近似计算。具体计算规则取决于所使⽤平台的实现。
数据类型
长度/字节
范围
FLOAT
4
DOUBLE
8
DECIMAL
最多65数字(5.0以上版本)
MySQL使⽤DOUBLE作为内部浮点计算的类型。注意,DECIMAL需要额外的空间和计算开销,所以只要要求尽量对⼩数进⾏精确时才使⽤DECIMAL,例如在存储财务数据时,可以⽤BIGINT来替代它来实现,只需要将数据乘以相应的倍数即可。
FLOAT和DOUBLE选择(尽量选择FLOAT)
如何有涉及到运算,⽤float和double可能会精度不准,可以考虑将⼩数乘于相应的倍数,然后⽤BIGINT来存储。
(3)、字符串类型
MySQL⽀持多种字符串类型。从4.1版本开始,每个字符串列可以定义⾃⼰的字符集和校对规则(排序规则),这些东西会在很⼤程度上影响性能。
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总是需要⼀个额外的字节来存储长度。
2、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能存储最⼩粒度为秒。但是可以使⽤微秒级的⼒度进⾏运算。
1、DATETIME
能保存1001到9999年,精度为秒。格式为YYYY-MM-DD HH:MM:SS与时区⽆关,使⽤⼋个字节的存储空间。
2、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执⾏⼤量删除操作时,产⽣数据“空洞”
删除id为7记录前后数据库所占内存,没有发⽣变化。
可以发现数据⽂件并没有因为数据删除⽽减少。
对表进⾏optimize(优化)操作:
optimize table t1;
可以发现表数据⽂件⼤⼤缩⼩,“空洞”空间已经被回收。
2.⽤合成(Synthetic)索引提⾼查询性能
根据⼤⽂本字段(text、blob)的内容建⽴⼀个散列值,并把这个值存储在单独的数据列中,然后通过散列值数据⾏。
缺点:只能进⾏精确查询(=范围操作符是没有⽤处的)
可以通过MySQL⾃带函数md5()、sha1()、crc32()⽣成散列值,也可以通过编程语⾔计算散列值。
注:如果散列算法⽣成的字符串带有尾部空格,不要把他们存储在char、varchar列中,他们会受到尾部空格去除的影响。
如果需要对blob或clob字段进⾏模糊查询,可以⽤前缀索引:
1
2
3
4
#前缀索引:对context字段的前100个字符创建索引
create index idx_blobon t2(context(100));
#查询⽅法
select *from t2where contextlike 'drake%';注:%不能放在最前⾯
合成索引只能⽤于精确匹配,在⼀定程度上减少了I/O,从⽽提⾼了查询效率。
3.在不必要的时候避免检索⼤型的blob或text值。
4.把blob或text列分离到单独的表中。
三、浮点数和定点数
1.浮点数存在误差问题。
2.对货币等对精度敏感的数据,应该⽤定点数表⽰或存储。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。