MySQL数据库使用规范

  • 基础规范须知事项

1. 使用Innodb存储引擎,MySQL默认16K。

2. 字符集使用utf8mb4,数据库排序规则使用utf8mb4_general_ci(utf8mb4 可以更好的存储Emoji表情)。

3.不同表,取相同字段进行关联查询,建议使用相同的数据库排序规则。

4. 所有表及其所属字段都需要添加注释。

5. 单表数据量控制在 5000W以内,超过 500W以上的表建议进行分区或者分表。

6. 历史数据归档存放归档库,整库大小控制在 500G以内。

7. 不在数据库中存储图、文件等大数据,把大对象放到专门的文件或视频服务器上,在数据库中仅存储它的路径。

8. 禁止从测试、开发环境直连生产数据库。

9. 建议对同一个表的多次alter操作合并为一次操作。

10. 单表字段不宜超过 50 个。

11. 连接MySQL不要将autocommit设置为0。

12. 数据库连接数设置需要与服务器硬件配置相匹配。

  • 数据库命名规范

1. 对于库名、表名、字段名等使用有意义的英文词汇,词汇中间以下划线分割,禁止超过 32 个字符,禁止使用中文。

2. 临时库及表名必须以_tmp+时间戳为后缀,例如:member_tmp_20190109。

3. 备份库及表必须以_bak+时间戳为为后缀,例如: member_bak_20190109。

  • 库、表、字段设计规范

1. 拆分字段,注意分离冷热数据。

2. 采用合适的分库分表策略。

3. 避免使用TEXT、BLOB类型,varchar字段性能比text高很多,实在避免不了blob,请拆表。

4. 用DECIMAL代替FLOAT和DOUBLE 存储精确浮点数。

5. 将字符转化为数字、使用TINYINT 来代替ENUM、SET类型。

6. 所有字段均定义为NOT NULL,并设置默认值。

7. 使用UNSIGNED存储非负整数。

8. MySQL5.6 及以后的版本中建议优先使用datetime存储时间。

9. MySQL5.6 及以后的版本中建议优先使用datetime存储时间。

10. 使用INT UNSIGNED存储IPV4。

11. 禁止在数据库中明文存储密码,请把密码加密后存。

  • 索引使用规范

1、索引数量和命名长度要求 :

   1) 单张表中索引数量不建议超过 5 个;

   2) 单个索引中的字段数不超过 5 个;

   3) 对字符串使用前缀索引,前缀索引长度不超过 8 个字符;

2. 主键准则

   1) 表必须有主键,没有合适的字段的话,写可以使用自增列作为主键;

   2) 不使用更新频繁的列作为主键;

   3) 尽量选择数值类型字段,不选择字符串字段;

   4) 不使用UUID、MD5、HASH这些作为主键。

  • 须加索引的场景

1) select、update、delete语句的where条件列;

2) order by、group by、distinct字段。

  • 多表关联(join)字段注意事项

1) 区分度最大的字段放在最前面;

2) 核心SQL优先考虑覆盖索引;

3) 避免冗余和重复索引;

4) 索引要综合评估数据密度和分布以及考虑查询和更新比例;

5) JOIN应避免产生笛卡尔积。

  • 索引禁忌

1) 不在低基数列上建立索引,例如:“性别”;

2) 不在索引列进行数学运算和函数运算;

3) 不在TEXT、BLOB字段上建立索引;

  • 禁止使用外键

1) 外键用来保护数据参照完整性,在业务端实现

2) 对父表和子表的操作会相互影响,降低可用性 

  • 索引命名和创建注意事项 

1) 非唯一索引以idx_字段 1_字段 2 命名;

2) 唯一索引以uniq_字段 1_字段 2 命名;

3) 索引名称全部小写;

4) 新建的唯一索引不能和主键重复;

5) 索引字段必须设置为NOT NULL;

6) 超过 20 个字符长度的字符串列,如需创建索引,可以考虑使用前缀索引。前缀索引的长度可以基于对该
字段的统计得出,一般略大于平均长度即可;

7) 尽量使用复合索引,而不是添加新的索引;比如索引idx1(a, b)已经涵盖了索引idx2(a),就可以考虑删
除 idx2 索引;

8) 使用唯一索引的一定要用唯一索引,提高查询效率。

  • MySQL索引的限制(索引失效)

1) MYSQL 目前不支持函数索引;

2) 使用不等于 (!= 或者 <>) 的时候, MYSQL 无法使用索引;

3) 过滤字段使用单行函数 (如 abs (column)) 后, MYSQL无法使用索引;

4) join语句中join条件字段类型不一致的时候MYSQL 无法使用索引;

5) 使用 LIKE 操作的时候如果条件以通配符开始 (如 ‘%abc…’)时, MYSQL无法使用索引;

6) 使用非等值查询的时候, MYSQL 无法使用 Hash 索引;

7) BLOB 和 TEXT 类型的列只能创建前缀索引。

  • SQL书写规范

1. SQL语句尽可能简单 大SQL语句尽可能拆成小SQL语句,MySQL对复杂SQL支持不好。

2. 事务要简单,整个事务的时间长度不要太长,SQL结束后及时提交。

3. 限制单个事务所操作的数据集大小,不能超过 10000 条记录

4. 禁止使用触发器、函数、存储过程。

5. 降低业务耦合度,为scale out、sharding留有余地

6. 避免在数据库中进行数学运算(数据库不擅长数学运算和逻辑判断)

7. 避免使用select *,需要查询哪几个字段就select这几个字段,避免buffer pool被无用数据填充。

8. 条件中使用到OR的SQL语句必须改写成用IN()(OR的效率比IN低很多)

9. IN()里面的数据个数建议控制在 500 以内,可以用exist代替in,exist在某些场景比in效率高,尽量不使用not in。 

10. limit分页注意效。

11. 当只要一行数据时使用LIMIT 1 。

12. 获取大量数据时,建议分批次获取数据,每次获取数据少于 10000 条,结果集应小于1M。 

13. 避免使用大表做 JOIN,使用group by分组、自动排序 。

14. SQL语句禁止出现隐式转换,例如:select id from test where id=’1’,其中 id 列为 int 等数字类型。

15. 在SQL中,尽量不使用like,且禁止使用前缀是%的like匹配。

16. 合理选择union all与union。 

17. 禁止在OLTP类型系统中使用没有where条件的查询。

18. 使用 prepared statement 语句,只传参数,比传递 SQL 语句更高效;一次解析,多次使用;降低SQL注入概率。

19. 禁止使用 order by rand()。

20. 禁止单条 SQL 语句同时更新多个表。

21. 不在业务高峰期批量更新或查询数据库,避免在业务高峰期alter表。

22. 禁止在主库上执行 sum,count 等复杂的统计分析语句,可以使用从库来执行。

  • 数据库安全

1. 只授予能满足需要的最小权限。

2. 创建用户的时候限制用户的登录主机,主机使用 IP 或 IP 网段,禁止使用主机名或%。

3. 初始化数据库后删除无密码的用户,删除 test 库。

4. 为每个用户设置满足密码复杂度的密码。

5. 定期清理不需要的用户。

6. 禁止授予普通用户 super 权限。 

你可能感兴趣的:(常用数据库)