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