时间:2021-07-01 10:21:17 帮助过:28人阅读
1. 越小越好,越简单越好
一般情况下,应该尽量使用可以正确存储数据的最小最简单的数据类型。因为它们占用更小的磁盘,内存和CPU缓存,处理时需要的CPU周期也更少。但同时,在确定选择时也务必注意不要低估需要存储的值的范围,否则会给后期带来麻烦。
2. 尽量避免NULL
NULL是列的默认属性,但通常情况下最好指定列为NOT NULL,除非真的需要存储NULL。因为含有NULL的列使得索引、索引统计和值比较都更加复杂,而且当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在myisam表里甚至还可能导致固定大小的索引变成可变大小的索引。
将可为null的列改为not null带来的性能提升比较小,所谓除非必要,否则不必特意去修改,但,如果计划在列上建索引,就应该尽量避免涉及成可为null的列。
InnoDB使用单独的位(bit)存储NULL值,所以对于稀疏数据(很多值为NULL,只有少数行的列有非NULL值)有很好的空间效率,但这一点不适用于myisam。
3. IP的存储
IP并不是字符串,而是32位无符号整数,用小数点将地址分为四段的表示方法只是为了让人们阅读容易,所以应该用无符号整数存储IP地址,MySQL提供了INET_ATON()和INET_NTOA()函数在这两种表示方法之间转换
mysql> show create table test; +-------+-----------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------+ | test | CREATE TABLE `test` ( `a` int(10) unsigned DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin | +-------+-----------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> insert into test values(inet_aton(‘192.168.1.200‘)), (inet_aton(‘200.100.30.241‘)); Query OK, 2 rows affected (0.01 sec) mysql> select * from test; +------------+ | a | +------------+ | 3232235976 | | 3362004721 | +------------+ mysql> select inet_ntoa(a) from test; +----------------+ | inet_ntoa(a) | +----------------+ | 192.168.1.200 | | 200.100.30.241 | +----------------+
二 具体数据类型介绍
1. 数字类型
(1)整数类型
基本使用:整数类型(显示宽度)
注:显示宽度对于数值的大小并无影响,只是当设置了zerofill的时候,在显示的时候补0而已。建议不要设显示宽度及zerofill
(2) 浮点数类型
基本使用:数据类型(M,D)
注1:M是指精度,总的数字长度;D是指标度,小数点后的数字长度,如DECIMAL(5,2) 可以存储5个数字和两个小数,即存储范围为-999.99到999.99。
注2:分为三类,DECIMAL(定点数)、FLOAT(单精度浮点型)、DOUBLE(双精度浮点型),一般用DECIMAL来存储精确数据,如工资等,但除非必须,否则最好不要用浮点数类型,可以考虑使用bigint代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
(3)超出范围和溢出处理
当MySQL存储了一个超出了指定范围的数值,其结果依赖于SQL mode的设置。
2. 时间类型
(1)date
范围:1000-01-01 to 9999-12-31
(2)datetime(fsp) fsp代表小数点后的位数
范围:1000-01-01 00:00:00.000000 to 9999-12-31 23:59:59.999999
eg: CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
(3)timestamp(fsp) fsp代表小数点后的位数
范围:1970-01-01 00:00:01.000000 UTC to 2038-01-19 03:14:07. 999999 UTC
特性:时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区
定义时加上DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 会设定当前时间为默认值并在后续更新该行中的任意值时更新时间为当前时间。 定义时只加上DEFAULT 而不加 ON UPDATE CURRENT_TIMESTAMP 会设定当前时间为默认值,后续更新该行内容时不再更新该时间值。DEFAULT有两种选择,一种是DEFAULT CURRENT_TIMESTAMP ,一种是可以具体指定一个时间。 CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0, dt DATETIME DEFAULT 0 );
(4)time
范围:-838:59:59.000000 to 838:59:59.000000
(5)year
范围:year(4) : 1901 to 2155
year(1/2):1 to 99 1-69会被转换为2001 to 2069 ,70-99会被转换为1970 to 1999 MySQL5.7.5之后已被去掉
3. 字符类型
(1) char和varchar
(2)binary和varbinary
mysql> CREATE TABLE t (c BINARY(3)); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO t SET c = ‘a‘; Query OK, 1 row affected (0.01 sec) mysql> SELECT HEX(c), c = ‘a‘, c = ‘a\0\0‘ from t; +--------+---------+-------------+ | HEX(c) | c = ‘a‘ | c = ‘a\0\0‘ | +--------+---------+-------------+ | 610000 | 0 | 1 | +--------+---------+-------------+ 1 row in set (0.09 sec)
(3)blob和text
(4)enum和set
create table test(e enum(‘fish‘, ‘apple‘, ‘dog‘) not null); insert into test values(‘fish‘),(‘dogs‘),(‘apple‘); mysql> select e+0 from test; +-----+ | e+0 | +-----+ | 1 | | 3 | | 2 | +-----+
mysql> select e from test; +-------+ | e | +-------+ | fish | | dog | | apple | +-------+
MySQL数据类型介绍
标签:32位 效率 row 否则 最小 指针 div 取数 数字