对规范的遵守可用二八原则,不要教条。为满足实际需求 可忽视部分规范。
1.索引规范 *目标 |--利用最小的索引成本找到需要的行记录 *原则 |--做前缀匹配 |--选择区分度高的列做前缀索引列 |--尽量使用重复索引 与where条件匹配 |--避免重复索引 |--索引列尽量包含 group by、order by所涉及的列 `--查询结果比较大时 考虑索引覆盖 2.SQL规范 *原则 |--避免大事务 减少等待和竞争 |--不要使用* 使用具体列名 |--遇到分页查询 使用延迟关联解决(如果有打offset,可先选取ID,然后用主键id关联) |--避免多表查询 避免join |--IN元素禁止超过300个 |--避免%前缀做模糊查询,不走索引 |--不要一次更新大量数据(>30000) |--尽量使用union或in 代替or |--避免使用子查询 尽量使用join `--不使用负向查询 not in/like 使用in 反向代替 3.DDl规范 *前提 |--DDL会锁表,评估锁表给业务系统带来的影响 *原则 |--所有变更提前一天提交 |--日常变更工作日下班后,重大变更时间沟通后确定 |--所有DDL变更 需和研发沟通 审核后再提交 `--所有新上线的表必须确定索引后才可上线 4.表的设计规范 *原则 |--使用innodb存储引擎,表的结尾必须是Engine=innodb Auto_increment=1 Default Charset=uft8mb4 |--表必须带有物理主键 | |--id int(10) unsigned primary key not null auto_increment | |--id bigint(19) unsigned primary key not null auto_increment | |--int(M) M 表示最大显示宽度,和数字位数也无关系。int(3),int(8) 在磁盘上都是占用 4 btyes 的存储空间 | `--预估数据会无限增加的表,主键一律所以用Bigint(19) unsigned |--禁止使用字符做主键 |--禁用联合主键 |--不在数据库中存储图片 文件等大数据 `--禁止使用分区表,定期创建分区表会给系统运维造成隐患 5.列设计规范 *原则 |--尽量减少存储空间 |--尽量使用数值类型+unsigned |--禁用blob/text字段 |--禁用NULL值,建议在定义时都加上默认值 | |--NULL字段很难查询优化 | |--NULL字段的复合索引无效 | `--NULL字段的索引需要额外空间 |--禁止使用外键 |--使用unsigned存储非负数 `--varchar(N) N表示的是字符数不是字节数。 |--Mysql中一个表中所有varchar字段最大长度和是65535个字节 `--进行排序和创建临时表时,会使用N的长度申请内存 6.命名规范 *规范 |--库/表/列/索引名称一律小写 |--命名不要超过32个字符 |--索引 | |--格式为idx_列名缩写 | `--唯一索引 uniq_列名缩写 `--做到见名知意
时间: 2024-11-05 14:06:04