一、表设计的规范
1. 每张表必须包含主键(id字段)。(无论是临时表、较小的配置表,还是无业务访问的
数据表 都必须有主键)
a. id:主键
1. 主键不能包含业务含义。
2. 主键在任何情况下不允许被更新。
3. 主键必须由特定的主键生成系统生成或者自增长字段
2. 作为表间连接关系的字段,数据类型必须保持严格一致,避免索引无法正常使用。
3. 存在过期概念的表,在其设计之初就必须有过期机制,且有明确的过期时间。过期数据
必须迁移至历史表中。
4、禁止使用外键约束
5、禁止使用临时表
二、数据类型建议
MySQL 数据库中尽量仅使用下文提及的数据类型。
数值类型
●DECIMAL(M,D)
当表示定点小数的情况下使用该类型。定点数在MySQL 内部以字符串形式存储,比浮点
数更精确,适合用来表示货币等精度高的数据。
●INT 系列
所有整数类型字段使用INT(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT),根据所
存放的数据大小选择合适的子类型,且所有INT 类型都不使用长度限制。
字符串类型
●CHAR
当且仅当字段存储单个字符的情况下,可使用CHAR(1)类型。超过一个字符的字段,使
用可变长度类型。
●VARCHAR
所有可变长度的字段均使用VARCHAR 类型,对于有限类别的字段(如性别、状态等),
均使用VARCHAR 类型存储能明显表现其意义的字符串。
当VARCHAR 字段长度超过4000 时,须和原表进行分拆,与原表主键组成新表存储。
●TEXT 系列
仅当需存储的字节数可能超过20000 时,使用TEXT 系列类型(TEXT、MEDIUMTEXT、
LONGTEXT)。并和原表进行分拆,与原表主键组成新表存储,且每个表只允许有一个TEXT
系列类型字段。因为所有MySQL 数据库都会使用UTF8 字符集,而TEXT 最大只能存放64K
数据。
时间类型
●DATE
只需要精确到天的字段使用DATE 类型。精确到“天”的取当前时期的操作使用CURDATE()
函数实现。
●DATETIME
需要精确到时间(时、分、秒)的字段使用DATETIME 类型。精确到“秒”的取当前时
间的操作使用 NOW()函数实现。
三、数据库设计相关要求
1. 除主键外,需存在唯一性约束的,可通过创建以“uk_”为前缀的唯一索引实现,但应
用中需要同时有唯一性检查逻辑。
2 禁止任何业务逻辑通过封装在数据库中的 procedure/function/trigger 实现。
3、禁止业务逻辑使用计划任务。
4、所有 Query 的 Where 条件中的变量,尽量使用绑定变量来实现,
5、禁止使用函数,在程序中完成逻辑功能
四、Sql 相关要求
1、数据类型转换
原则
避免因数据类型转换导致执行计划有误。
说明
●where 条件中的过滤字段如需转换类型,只可转换过滤值,不可转换被过滤字段。
●表连接操作中,作为连接条件的字段的数据类型严格一致。
2、“c o u n t (…)”使用
除非是明确目的是统计某个字段上值不为空的记录的数目,否者只允许之用 count(*),
而不允许使用 count(column_name) 或者 count(1)。
3、“l i k e …”使用
只允许使用右模糊,不允许使用全模糊。
示例
禁止:
select column_name from table_name like '%abc%';
允许:
select column_name from table_name like 'abc%';
4、“select * from …”使用
原则
为避免查询中无用字段参与排序操作而导致的性能降低及潜在的安全隐患。原则上不建
议使用“select * from …”。
说明
●当结果集中无需列出被查询表的所有字段,且查询中存在“order by”语句时。禁止
使用“select *”取出所有字段。
●连接查询中,禁止使用“select *”。
5、表连接
原则
规范连接语法以方便 SQL 脚本的阅读及提升连接操作性能。
说明
●非外连接查询中,连接表在“from”子句中列出,并以逗号分隔;连接条件在“where”
子句中列出,而不允许使用 join … on 方式实现 join。
●外连接查询中,可使用“left join … on”语法;外连接一律使用“left join”表
示。
●可以改写为连接的子查询禁止使用子查询方式,而应改写为连接方式。
示例 a.
非规范用法1:select col1 from tbl1
where col2 in (select col3 from tbl2);
规范化用法1:select col1 from tbl1,tbl2
where tbl1.col2 = tbl2.col3;
非规范用法2:select col1 from tbl1
6、尽量将OR查询拆分为多个SQL做UNION ALL或在程序拼接(因为mysql本身优化器缺陷)
五、字符集
MySQL 数据库都会使用UTF8 字符集,所有连接必须是utf8字符集。无特殊情况,不允许
使用gbk和latin1
六、关于DDL操作
闭市期间进行数据库生产变更DDL操作,同时尽可能在业务压力很小的情况下进行,如果
对造成的影响不确定,请与平台架构团队沟通确认后再实施变更操作。
七、关于应用服务器
所留连接生产数据库服务器,请将IP在上线前发给平台组MySQL管理组(管文琦、王成瑞)
八、关于视图
考虑的sql效率 任何情况下 不允许使用视图
1. 每张表必须包含主键(id字段)。(无论是临时表、较小的配置表,还是无业务访问的
数据表 都必须有主键)
a. id:主键
1. 主键不能包含业务含义。
2. 主键在任何情况下不允许被更新。
3. 主键必须由特定的主键生成系统生成或者自增长字段
2. 作为表间连接关系的字段,数据类型必须保持严格一致,避免索引无法正常使用。
3. 存在过期概念的表,在其设计之初就必须有过期机制,且有明确的过期时间。过期数据
必须迁移至历史表中。
4、禁止使用外键约束
5、禁止使用临时表
二、数据类型建议
MySQL 数据库中尽量仅使用下文提及的数据类型。
数值类型
●DECIMAL(M,D)
当表示定点小数的情况下使用该类型。定点数在MySQL 内部以字符串形式存储,比浮点
数更精确,适合用来表示货币等精度高的数据。
●INT 系列
所有整数类型字段使用INT(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT),根据所
存放的数据大小选择合适的子类型,且所有INT 类型都不使用长度限制。
字符串类型
●CHAR
当且仅当字段存储单个字符的情况下,可使用CHAR(1)类型。超过一个字符的字段,使
用可变长度类型。
●VARCHAR
所有可变长度的字段均使用VARCHAR 类型,对于有限类别的字段(如性别、状态等),
均使用VARCHAR 类型存储能明显表现其意义的字符串。
当VARCHAR 字段长度超过4000 时,须和原表进行分拆,与原表主键组成新表存储。
●TEXT 系列
仅当需存储的字节数可能超过20000 时,使用TEXT 系列类型(TEXT、MEDIUMTEXT、
LONGTEXT)。并和原表进行分拆,与原表主键组成新表存储,且每个表只允许有一个TEXT
系列类型字段。因为所有MySQL 数据库都会使用UTF8 字符集,而TEXT 最大只能存放64K
数据。
时间类型
●DATE
只需要精确到天的字段使用DATE 类型。精确到“天”的取当前时期的操作使用CURDATE()
函数实现。
●DATETIME
需要精确到时间(时、分、秒)的字段使用DATETIME 类型。精确到“秒”的取当前时
间的操作使用 NOW()函数实现。
三、数据库设计相关要求
1. 除主键外,需存在唯一性约束的,可通过创建以“uk_”为前缀的唯一索引实现,但应
用中需要同时有唯一性检查逻辑。
2 禁止任何业务逻辑通过封装在数据库中的 procedure/function/trigger 实现。
3、禁止业务逻辑使用计划任务。
4、所有 Query 的 Where 条件中的变量,尽量使用绑定变量来实现,
5、禁止使用函数,在程序中完成逻辑功能
四、Sql 相关要求
1、数据类型转换
原则
避免因数据类型转换导致执行计划有误。
说明
●where 条件中的过滤字段如需转换类型,只可转换过滤值,不可转换被过滤字段。
●表连接操作中,作为连接条件的字段的数据类型严格一致。
2、“c o u n t (…)”使用
除非是明确目的是统计某个字段上值不为空的记录的数目,否者只允许之用 count(*),
而不允许使用 count(column_name) 或者 count(1)。
3、“l i k e …”使用
只允许使用右模糊,不允许使用全模糊。
示例
禁止:
select column_name from table_name like '%abc%';
允许:
select column_name from table_name like 'abc%';
4、“select * from …”使用
原则
为避免查询中无用字段参与排序操作而导致的性能降低及潜在的安全隐患。原则上不建
议使用“select * from …”。
说明
●当结果集中无需列出被查询表的所有字段,且查询中存在“order by”语句时。禁止
使用“select *”取出所有字段。
●连接查询中,禁止使用“select *”。
5、表连接
原则
规范连接语法以方便 SQL 脚本的阅读及提升连接操作性能。
说明
●非外连接查询中,连接表在“from”子句中列出,并以逗号分隔;连接条件在“where”
子句中列出,而不允许使用 join … on 方式实现 join。
●外连接查询中,可使用“left join … on”语法;外连接一律使用“left join”表
示。
●可以改写为连接的子查询禁止使用子查询方式,而应改写为连接方式。
示例 a.
非规范用法1:select col1 from tbl1
where col2 in (select col3 from tbl2);
规范化用法1:select col1 from tbl1,tbl2
where tbl1.col2 = tbl2.col3;
非规范用法2:select col1 from tbl1
6、尽量将OR查询拆分为多个SQL做UNION ALL或在程序拼接(因为mysql本身优化器缺陷)
五、字符集
MySQL 数据库都会使用UTF8 字符集,所有连接必须是utf8字符集。无特殊情况,不允许
使用gbk和latin1
六、关于DDL操作
闭市期间进行数据库生产变更DDL操作,同时尽可能在业务压力很小的情况下进行,如果
对造成的影响不确定,请与平台架构团队沟通确认后再实施变更操作。
七、关于应用服务器
所留连接生产数据库服务器,请将IP在上线前发给平台组MySQL管理组(管文琦、王成瑞)
八、关于视图
考虑的sql效率 任何情况下 不允许使用视图