Mysql - Mysql优化- 表的优化与列类型选择
in MYSQL with 0 comment

Mysql - Mysql优化- 表的优化与列类型选择

in MYSQL with 0 comment

Mysql - Mysql优化- 表的优化与列类型选择

说明

表的优化与列类型选择的学习记录


表的优化

定长与变长分离
如 id int, 占4个字节, char(4) 占4个字符长度,也是定长, time 
即每一单元值占的字节是固定的.
核心且常用字段,宜建成定长,放在一张表。
而varchar, text,blob,这种变长字段,适合单放一张表, 用主键与核心表关联起来.
常用字段和不常用字段要分离
需要结合网站具体的业务来分析,分析字段的查询场景,查询频度低的字段,单拆出来.
合理添加冗余字段

列的优化

字段类型优先级 整型 > date,time > enum,char>varchar > blob
整型: 定长,没有国家/地区之分,没有字符集的差异
time定长,运算快,节省空间. 考虑时区,写sql时不方便 where > ‘2005-10-12’;
enum: 能起来约束值的目的, 内部用整型来存储,但与char联查时,内部要经历串与值的转化
Char 定长, 考虑字符集和(排序)校对集
varchar, 不定长 要考虑字符集的转换与排序时的校对集,速度慢.
text/Blob 无法使用内存临时表

附: 关于date/time的选择,大师的明确意见
http://www.xaprb.com/blog/2014/01/30/timestamps-in-mysql/

性别:  以utf8为例
char(1) , 3个字长字节
enum(‘男’,’女’);  // 内部转成数字来存,多了一个转换过程
tinyint() ,  // 0 1 2 // 定长1个字节.
够用就行,不要慷慨 (如smallint,varchar(N))
原因: 大的字段浪费内存,影响速度,
以年龄为例 tinyint unsigned not null ,tinyint可以存储255岁,足够. 用int浪费了3个字节
以varchar(10) ,varchar(300)存储的内容相同, 但在表联查时,varchar(300)要花更多内存
尽量避免用NULL()
原因: NULL不利于索引,要用特殊的字节来标注。
在磁盘上占据的空间其实更大。
这种情况下可以default 为 空。
Enum列的说明
1: enum列在内部是用整型来储存的
2: enum列与enum列相关联速度最快
3: enum列比(var)char 的弱势---在碰到与char关联时,要转化. 要花时间.
4: 优势在于,当char非常长时,enum依然是整型固定长度.
当查询的数据量越大时,enum的优势越明显.
5: enum与char/varchar关联 ,因为要转化,速度要比enum->enum,char->char要慢,
但有时也这样用-----就是在数据量特别大时,可以节省IO.

结尾

腹有诗书气自华,最是书香能致远。

Responses