2026-04-21 05:46:53
程序员在使用数据库时应遵循以下规范,涵盖库表设计、索引优化及SQL编写等方面,以确保数据库性能、可维护性和数据一致性:
一、数据库命名规范库命名规则
名称长度不超过32字符,仅使用小写字母、数字、下划线,以字母开头。
格式为业务系统名_子系统名(如order_system_payment),避免使用拼音或缩写。
创建时显式指定字符集为utf8或utf8mb4(如CREATE DATABASE db_name DEFAULT CHARSET utf8mb4)。
临时库/表以tmp_开头并附加日期后缀(如tmp_user_20231001),备份库/表以bak_开头并附加日期。
表命名规则
名称长度不超过32字符,仅使用小写字母、数字、下划线,需与模块强相关(如user_info、order_detail)。
同一模块的表使用统一前缀(如user_、order_),避免使用关键字(如type、order)。
显式指定存储引擎为InnoDB,字符集为utf8或utf8mb4,并添加表注释(如COMMENT='用户信息表')。
大表(超过100万行)的ALTER TABLE操作需经DBA审核,并在低峰期执行。
主键与索引字段
主键强制命名为id,类型为int unsigned或bigint unsigned,自增且不可更新。
业务标识字段(如user_id)设为UNIQUE KEY而非主键,避免随机插入导致页分裂。
核心表需包含create_time和update_time字段,类型为TIMESTAMP,默认值分别为CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
字段属性
优先使用NOT NULL并定义默认值(如DEFAULT 0),避免NULL导致的存储空间浪费和聚合函数偏差。
中间表(临时结果集)以tmp_开头,备份表以bak_开头,并定期清理。
示例建表语句:
CREATE TABLE user_info ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', user_id BIGINT NOT NULL COMMENT '用户ID', username VARCHAR(45) NOT NULL COMMENT '用户名', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uniq_user_id (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';索引类型与命名
InnoDB表主键必须为自增整数,索引类型强制为BTREE。
主键索引命名为pk_字段名(如pk_id),唯一索引命名为uniq_字段名(如uniq_user_id),普通索引命名为idx_字段名(如idx_username)。
单表索引数量不超过8个,优先建立联合索引(如idx_create_time_status),并将区分度高的字段前置。
索引优化建议
多表JOIN时,被驱动表的连接字段需有索引。
避免冗余索引(如已有key(a,b),则key(a)需删除)。
索引列禁止使用函数或表达式(如WHERE LENGTH(name)='Admin')。
查询规范
SELECT和INSERT必须显式指定字段名,禁止使用*或省略字段列表。
DML语句(除静态表外)必须包含WHERE条件,且条件字段类型需与索引一致。
禁止全模糊LIKE查询(如WHERE name LIKE '%admin%'),需结合等值或范围条件。
多表JOIN不超过5个表,优先选择小结果集作为驱动表,并避免跨库JOIN。
批量操作与事务
单次INSERT值不超过5000个,避免主从同步延迟。
事务内SQL不超过5条,更新语句尽量基于主键或唯一键(如UPDATE t SET ... WHERE id=1)。
批量操作需控制事务间隔时间(如sleep(0.1)),防止锁等待超时。
排序与分组优化
减少使用ORDER BY、GROUP BY和DISTINCT,优先通过索引排序(如WHERE a=1 ORDER BY b利用key(a,b))。
包含排序/分组的查询,WHERE过滤结果集需小于1000行。
遵循上述规范可显著提升数据库性能、降低维护成本,并减少因设计缺陷导致的线上故障。实际开发中需结合业务场景灵活调整,但核心原则(如索引优化、事务控制)需严格遵守。