Skip to content

MySQL命名规范

命名规范

  • 库名、表名、字段必须使用小写,以下划线分隔,需见名知意

  • 一般不超过32个字符,不使用MySQL保留字

  • 临时库、表,必须以表名+日期+tmp为后缀, 如:users_20230102_tmp

  • 备份库、表,必须以表名+日期+bak为后缀, 如:users_20230102_bak

  • 使用utf8mb4字符集,一般使用 utf8mb4_general_ci(5.7)/utf8mb4_0900_ai_ci(8.0) 为字符集

设计规范

  • 所有表必须有主键,并以id命名,不使用uuid做索引,建议使用自增ID或发号器

  • 除日志类表外,时间、日期统一使用 datetime(YYYY-MM-DD HH:II:SS),牺牲微小的性能和空间,大大提高可读性

  • 拆分大字段、访问频率低的字段,分离冷热数据

  • 禁止使用分区表

  • 非必要,字段不可定义为 NULL

  • 非必要,不分表(一般表3年数据量低于千万级,无需分表,日志、操作记录类表,根据增量按年、月分表)

  • 浮点数用 decimal 存储

  • 不可使用枚举字段,用UNSIGNED TINYINT/UNSIGNED INT替代,并备注各自含义

  • 数据库中不允许存储大文件、图片,存储到OSS中

  • ip地址存储INT,而非CHAR

  • 禁止使用外键

  • 敏感数据禁止明文存储,如密码

索引规范

  • 索引数量不可过多,单张表不超过5个 (索引过多,占据过多空间,且写入/修改性能低)

  • 单个索引中字段不可超过5个

  • 索引建议

    • 常用的WHERE条件的字段

    • 常用的ORDER BY字段

    • 常用的GROUP BY字段

    • 常用的DISTINCT字段

    • 索引的选择性值低的字段(20%),不建议建立索引,如性别

    • 索引命名,主键pk_,唯一索引uk_, 普通索引idx_

    • 非必要,禁止使用 force index

SQL规范

  • 复杂SQL,尽可能拆成小的、简单的SQL

  • 尽量避免使用触发器、函数、存储过程

  • 尽量避免在数据库中进行数学运算 (将导致索引不可用)

  • 尽量用 IN() 代替 OR (IN中的元素较少时)

  • IN 中元素的个数尽量少于500个(经验值, 不一定准确)

  • 尽量避免使用JOIN

  • 禁止使用 ORDER BY RAND()

索引不生效的情况

  • 索引使用了函数、运算

  • 使用了模糊查询,如 %like%

  • 使用了OR条件,可能导致索引失效

  • 在查询中使用了强制类型转换,可能会导致索引失效

  • 索引的数据类型和查询的数据类型不匹配,可能导致索引失效

  • 过度索引,过多的索引可能导致优化器无法选择最佳索引

  • 不稳定的数据分布,数据分布不均匀导致索引过于广泛

  • 查询条件对索引列使用了!=、 <>、 NOT NULL,可能导致索引失效

  • 联合索引A-B-C,只有A、AB、ABC可能用到,WHERE A=x1 AND B > x2 AND C=x3,只能用到A-B