数据库性能之表结构优化

一、表结构优化

1、数字类型:存储空间浪费,空间大小不一样,搜索速度也不一样
(1).tinyint 8位 -128~127  unsigned tinyint(0~255)
    int,bigint,能确定不会使用负数的字段,建议添加unsigned定义
(2).固定精度的小数,不建议使用decimal表示,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附件维护成本,比如钱都是精确到分,不存3.12元,存312分

2、字符类型:
(1).char类型:定长类型
(2).不定长类型使用varchar,设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定
(3).非万不得已,不要使用text数据类型,其处理方式决定了它的性能低于char或varchar类型的处理
(4).建议使用整形来存储某些特殊的定长字符数据,比如IP地址,这样可以大大的节约存储空间
select inet_aton('192.168.100.200') --> 3232261320
select inet_ntoa(3232261320) --> 192.168.100.200
采用上面的方式,使用一个int就可以存放IP地址了

3、时间类型:
(1).尽量使用timestamp类型,因为其存储空间只需要datetime类型的一半
(2).对于只需要精确到某一天的数据类型,建议使用date类型,因为他的存储空间只需要3个字节,比timestamp还少
(3).不建议通过int类型存储一个UNIX TIMESTAMP的值,因为这太不直观,会给运维带来不必要的麻烦,同时还不会带来任何好处

4、适当拆分:
    当表中存储类似于TEXT或者是很大的VARCHAR类型的大字段的时候,如果大部分访问这张表的时候都不需要这个字段,就该把这个字段拆分到另外的独立表中,以减少常用数据块所占用的存储空间;
    这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理IO次数,也能大大提高内存中的缓存命中率。

5、适度冗余:
    被频繁引用且只能通关Join 2张(或更多)大表的方式才能得到的独立小字段,但是,需要特别注意的是,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

6、尽量使用not null
    尽量确保字段的default值不是null,因为null类型比较特殊,使用null类型会导致SQL语句难以优化

猜你喜欢

转载自www.cnblogs.com/TheoryDance/p/10325000.html