用惨痛教训换来的156条MySQL设计规约( 三 )


SELECT INET_ATON('192.168.172.3'); 3232279555 SELECT INET_NTOA(3232279555); 192.168.172.3
9.【推荐】字段长度尽量按实际需要进行分配,不要随意分配一个很大的容量 。
10.【推荐】核心表字段数量尽可能地少,有大字段要考虑拆分 。
11.【推荐】适当考虑一些反范式的表设计,增加冗余字段,减少JOIN 。
12.【推荐】资金字段考虑统一*100处理成整型,避免使用decimal浮点类型存储 。
13.【推荐】使用VARBINARY存储大小写敏感的变长字符串或二进制内容 。
说明:VARBINARY默认区分大小写,没有字符集概念,速度快 。
14.【参考】INT类型固定占用4字节存储 。
说明:INT(4)仅代表显示字符宽度为4位 , 不代表存储长度 。数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,Python/ target=_blank class=infotextkey>Python、JAVA客户端等不具备这个功能 。
15.【参考】区分使用DATETIME和TIMESTAMP 。
说明:存储年使用YEAR类型、存储日期使用DATE类型、存储时间(精确到秒)建议使用TIMESTAMP类型 。
DATETIME和TIMESTAMP都是精确到秒 , 优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节,同时TIMESTAMP具有自动赋值以及?自动更新的特性 。
补充:如何使用TIMESTAMP的自动赋值属性?
自动初始化,而且自动更新:column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP 只是自动初始化:column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 自动更新,初始化的值为0:column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 初始化的值为0:column1 TIMESTAMP DEFAULT 0
16.【推荐】将大字段、访问频率低的字段拆分到单独的表中存储 , 分离冷热数据 。
说明:有利于有效利用缓存,防?读入无用的冷数据 , 较少磁盘IO , 同时保证热数据常驻内存提?高缓存命中率 。
17.【参考】VARCHAR(N),N表示的是字符数不是字节数,比如VARCHAR(255),可以最大可存储255个汉字,需要根据实际的宽度来选择N 。
18.【参考】VARCHAR(N),N尽可能?。?蛭狹ySQL一个表中所有的VARCHAR字段最大长度是65535个字节 , 进行排序和创建临时表一类的内存操作时 , 会使用N的长度申请内存 。
19.【推荐】VARCHAR(N),N>5000时,使用BLOB类型 。
20.【推荐】使用短数据类型,比如取值范围为0~80时,使用TINYINT UNSIGNED 。
21.【强制】存储状态,性别等 , 用TINYINT 。
22.【强制】所有存储相同数据的列名和列类型必须一致(在多个表中的字段如user_id , 它们类型必须一致) 。
23.【推荐】优先选择符合存储需要的最小数据类型 。
24.【推荐】如果存储的字符串长度几乎相等,使用 char 定长字符串类型 。
七、索引设计规范
1.【推荐】单表索引建议控制在5个以内 。
说明:索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率,所以不是越多越好 。
2.【强制】禁止在更新十分频繁,区分度不高的属性上建立索引 。
3.【强制】建立组合索引必须把区分度高的字段放在前面 。
4.【推荐】对字符串使用索引 , 如果字符串定义长度超过128的,可以考虑前缀索引 。
5.【强制】表必须有主键,并且是auto_increment及not null的 , 根据表的实际情况定义无符号的tinyint,smallint,int,bigint 。
6.【强制】禁止更新频繁的列作为主键 。
7.【强制】禁止字符串列作为主键 。
8.【强制】禁止UUID MD5 HASH这些作为主键(数值太离散了) 。
9.【推荐】默认使用非空的唯一键作为主键 。
10.【推荐】主键建议选择自增或发号器 。
11.【推荐】核心SQL优先考虑覆盖索引 。
12.【参考】避免冗余和重复索引 。
13.【参考】索引要综合评估数据密度和分布以及考虑查询和更新比例 。
14.【强制】不在索引列进行数学运算和函数运算 。
15.【推荐】研发要经常使用explAIn,如果发现索引选择性差,必须要学会使用hint 。
16.【推荐】能使用唯一索引就要使用唯一索引,提高查询效率 。
17.【推荐】多条字段重复的语句,要修改语句条件字段的顺序,为其建立一条联合索引,减少索引数量 。
18.【强制】索引字段要保证不为NULL,考虑default value进去 。NULL也是占空间,而且NULL非常影响索引的查询效率 。
19.【强制】新建的唯一索引不能和主键重复 。


推荐阅读