本文为系列文章,紧张介绍36条来自一线的MySQL数据库开发实战经验,每一条经验背后都是血淋林的教训,若有一条让你有所受益,本文的目标就达到了。
本文将36条军规做了如下分类:
一.核心军规(5)
二.字段类军规(6)
三.索引类军规(5)
四.SQL类军规(15)
五.约定类军规(5)
为了避免收藏不看,让大家更有耐心看下去,印象更深刻些,小编将按以上分类分5次分别发布这些内容,本文是其中的第2篇,介绍字段类军规:
用好数值字段类型
三类数值类型:
- √ TINYINT(1Byte)
- √ SMALLINT(2B)
- √ MEDIUMINT(3B)
- √ INT(4B)、 BIGINT(8B)
- √ FLOAT(4B)、 DOUBLE(8B)
- √ DECIMAL(M,D)
举例:
- √ INT(1) VS INT(11)
- √ BIGINT AUTO_INCREMENT
- √ DECIMAL(18,0)
将字符转化为数字
数字型VS字符串型索引
举例:用无符号INT存储IP更好,而非CHAR(15)
- √ INT UNSIGNED
- √ INET_ATON()
- √ INET_NTOA()优先使用ENUM或SET
优先使用ENUM或SET
存储
- √ ENUM占用1字节,转为数值运算
- √ SET视节点定,最多占用8字节
- √ 比较时需要加‘单引号(即使是数值)
举例
- √ `sex` enum('F','M') COMMENT '性别'
- √ `c1` enum('0','1','2','3') COMMENT '职介审核'避免使用NULL字段
避免使用NULL字段
- √ 很难举行查询优化
- √ NULL列加索引,需要额外空间
- √ 含NULL复合索引无效
举例
- √ `a` char(32) DEFAULT NULL,反例,不应使用NULL做默认值
- √ `b` int(10) NOT NULL,反例,不应使用NULL做默认值
- √ `c` int(10) NOT NULL DEFAULT 0
少用并拆分TEXT/BLOB
TEXT类型处理性能远低于VARCHAR
- √ 强制生成硬盘暂时表
- √ 浪费更多空间
- √ VARCHAR(65535)==>64K (注意UTF-8)
尽量不消TEXT/BLOB数据类型
若必须使用则拆分到单独的表
举例:
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
data text NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
不在数据库里存图片
字段类军规小结
用好数值字段类型
将字符转化为数字
优先使用枚举ENUM/SET
避免使用NULL字段
少用并拆分TEXT/BLOB
不在数据库里存图片
上一篇 |