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字段。
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) 使用唯一索引的一定要用唯一索引,提高查询效率。
1) MYSQL 目前不支持函数索引;
2) 使用不等于 (!= 或者 <>) 的时候, MYSQL 无法使用索引;
3) 过滤字段使用单行函数 (如 abs (column)) 后, MYSQL无法使用索引;
4) join语句中join条件字段类型不一致的时候MYSQL 无法使用索引;
5) 使用 LIKE 操作的时候如果条件以通配符开始 (如 ‘%abc…’)时, MYSQL无法使用索引;
6) 使用非等值查询的时候, MYSQL 无法使用 Hash 索引;
7) BLOB 和 TEXT 类型的列只能创建前缀索引。
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 权限。