MySQL基础之开发规范

MYSQL基础操作之开发规范

对规范的遵守可用二八原则,不要教条。为满足实际需求 可忽视部分规范。

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_列名缩写
    `--做到见名知意