建表原则(表的优化与列类型原则)

1.定长与变长分离
    如 id int占4个字节,char(4) 占4个字符长度,也是定长,time即每一单元值占的字节是固定的
    核心且常用字段,直建成定长,方在一张表上
    而 varchar,text,blob这种变长字段,适合单方一章表,用主键与核心表关联起来

2.常用字段要与非常用字段分离
    需要结合网站的具体业务分析,分析字段的查询场景,查询频率低的字段单拆出来

3.在1对多需要关联统计的字段,添加冗余字段
    例如,栏目组要查询栏目组下面的文章数量,如果没有冗余字段,就需要关联查询
         可以在栏目表中添加章节数量字段,可以避免关联查询

列类型选择

1.字段类型优先级
    整型 > date,time > emum char > varchar > blob,text

2.列特点分析
    (1) 整型:定长,没有国家/地区之分,没有字符集差异
        比如,tinyint 1 2 3 4 <==> char(1) a b c d
        从空间上看都是一字节,但是order by 排序tinyint快
        原因:后者需要考虑字符集与校对集(就是排序优先集)

        time : 定长运算快,节省时间,考虑时区,写sql不方便
        enum : 能约束值的目的,内部用整形来储存,但与char联查时,内部要经历串与值的转化
        char : 定长,考虑字符集和校对集
        varchar : 不定长,要考虑字符集的转换与排序时的校对集,速度慢
        text,blob : 无法使用内存临时表(排序操作只能在磁盘上进行)

        注意:
             date,time的选择可以直接选择使用时间戳

            char(1),3个字节
            enum("男","女") //内部转成数字来储存,多了一个转换的过程
            tinyint()  // 0 1 2 定长1字节

    (2)够用就行不要慷慨
         大的字段影响内存影响速度
         以年龄为例:tinyint unsigned not null;可以储存255岁,足够了,用int浪费3个字节
         以varchar(10),varchar(300)储存的内容相同,但在表中查询时,varhcar(300)要花用更多内存

    (3)尽量避免NULL()
        Null不利于索引,要用到特殊字节来标注
        (在磁盘上占据内存更大,mysql5.5已经做过优化,但是还是不便)
        null也不便于查询,=null 或者 != null 都查询不到值,只有使用 is null 或者 is not null 才可以
        可以在创建字段时候使用 not null default "" 的形式