MySql数据库
一建表规约
1、表达是与否概念的字段,必须使用is_xxx的命名方式,数据类型是unsigned tinyint(1:是,0否)
正例:表达逻辑删除的字段名is_deleted,1表示删除,0表示未删除。
2、表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
说明:MySql在window下不区分大小写,但在Linux下默认区分大小写。因此,数据库名、表名、字段名、都不允许出现任何大写字母,避免节外生枝。
正例:rdc_config,level3_name
反例:rdcConfig,level_3_name
3、禁用保留字
4、主键索引为pk_字段名;唯一索引为uk_字段名;普通索引名则为idx_字段名
5、小数类型为decimal,禁止float和double
说明:float和double在存储的时候,存在精度丢失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。
6、如果存储的字符串的长度几乎不变,使用char定长字符串类型
7、varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出一张表用主键来对应,避免影响其他字段索引效率;
8、表的命名最好加上“业务名称_表的作用”;
9、如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释
10、字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵守:
1)不是频繁修改的字段
2)不是varchar超长的字段,更不能是text字段
11、单表行数超过500万行或者单表容量超过2G,才推荐进行分库分表。
二 索引约束
1、业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了分厂完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。
索引认识不够,不知道要摘哪些,待学习
三 SQL语句
1、不要使用count(列名)或count(常量)来代替count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟null和非null有关。除非统计的列没有null值。
说明:count(*)会统计值为null的行,而count(列名)不会统计此列为null的行。
2、count(distinct col)计算该列除null之外的不重复的行数,注意count(distinct col1,col2)如果其中一行全为null,那么即使另一行有不同的值,也返回0;
3、使用ISNULL来判断是否为null值
说明:null与任何值的直接比较都为null
1)null<>null的返回结果是null,而不是false;
2)null=null的返回结果是null,而不是false;
3)null<>1的返回结果是null,而不是true;
4、在代码中写分页逻辑时,若count为0应直接返回,避免执行后面的分页语句。
5、不得使用外键与级联,一切外键概念必须在应用层解决
说明:外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据更新风暴的风险;外键影响数据的插入。
6、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
7、in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素个数,控制在1000个之内。
四 ORM映射
1、在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。
说明:1)增加查询分析器解析成本。2)增加字段容易与resultMap匹配不一致。
2、在xxx.xml配置参数使用:#{},#param#不要使用${}此种方式容易出现SQL注入。
3、不允许直接拿HashMap与HashTable作为查询结果集的输出
说明:resultClass=“Hashtable”,会置入字段名和属性值,但是值的类型不可控。
4、不要写一个大而全的数据更新接口。传入POJO类,不管是不是自己的目标更新字段,都进行update table set c1=value1,c2=vlaue2,c3=value3;这是不对的,执行SQL时,不要更新无改动的字段,一是容易出错,二是效率低,三是增加binlog存储。