MySQL 语言规范
约 745 字大约 2 分钟
2026-02-02
面试与协作中常用的 MySQL/SQL 书写与命名约定。
一、 书写
- 字符串:单引号;避免在 SQL 中拼接,使用参数化/预编译防注入。
二、 建表规约
- 数据字段: is_xxx 命名的,数据类型是 unsigned tinyint( 1 表示是,0 表示否),任何字段如果为非负数,必须是 unsigned。
- 索引命名:主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
- 小数:小数类型为 decimal,禁止使用 float 和 double。
- 字符串长度:【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
- 冗余:字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:不是频繁修改的字段;不是 varchar 超长字段,更不能是 text 字段。
- 分库分表:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
三、 索引规约
- 外键:视项目约定;高并发或分库场景常不用数据库外键,由应用保证一致性。
- 索引数量:单表索引不宜过多,避免写放大;覆盖常用查询与排序字段。
- 性能:SQL 性能优化的目标: 至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。
四、 ORM映射
- XML:【强制】sql.xml 配置参数使用: #{},#param# 不要使用${} 此种方式容易出现 SQL 注入
- queryForList:iBATIS 自带的 queryForList(String statementName,int start,int size)不推荐使用。说明 : 其实现方式是在数据库取到statementName对应的SQL语句的所有记录,再通过subList 取 start,size 的子集合。
- 数据更改:不要写一个大而全的数据更新接口,传入为 POJO 类,不管是不是自己的目标更新字段,都进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL 时,不要更新无改动的字段,一是易出错;二是效率低;三是增加 binlog 存储。
- 事务:@Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。
五、 常用约定
- 软删除:可用
deleted_at或is_deleted,查询时默认过滤已删除。 - 大文本:与短字段分表或拆字段,避免 SELECT * 拖慢查询。
- 分页:深分页避免大 offset,可用游标/上次主键条件或延迟关联优化。
扩展
可结合「SQL」「架构」「高可用」:SQL 与存储引擎选型、读写分离与分库分表下的规范约定。