用惨痛教训换来的156条MySQL设计规约( 五 )


说明:count( * ) 会统计值为 NULL 的行,而 count( 列名 ) 不会统计此列为 NULL 值的行 。
23.【推荐】INSERT语句使用batch提交(INSERT INTO tableVALUES(),(),()……),values的个数不应过多 。
24.【推荐】获取大量数据时 , 建议分批次获取数据,每次获取数据少于2000条,结果集应小于1M 。
25.【推荐】在做开发时建议使用数据库框架(如mybatis)或prepared statement , 可以提升性能并避免SQL注入 。
26.【强制】禁止跨库查询(为数据迁移和分库分表留出余地,降低耦合度,降低风险) 。
27.【推荐】尽量避免使用子查询 , 可以把子查询优化为join操作(子查询的结果集无法使用索引,子查询会产生临时表操作 , 如果子查询数据量大会影响效率,消耗过多的CPU及IO资源) 。
28.【强制】超过三个表禁止 join(需要 join 的字段,数据类型必须绝对一致;多表关联查询时 , 保证被关联的字段需要有索引 。即使双表 join 也要注意表索引、SQL 性能) 。
29.【推荐】SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别 , 如果可以是 consts最好 。
30.【推荐】尽量不要使用物理删除(即直接删除 , 如果要删除的话提前做好备份),而是使用逻辑删除 , 使用字段delete_flag做逻辑删除,类型为tinyint , 0表示未删除,1表示已删除 。
31.【强制】在代码中写分页查询逻辑时 , 若 count 为 0 应直接返回,避免执行后面的分页语句 。
32.【强制】程序连接不同的数据库要使用不同的账号 。
33.【推荐】使用 ISNULL()来判断是否为 NULL 值? 。
九、行为规范
1.【强制】禁止使用应用程序配置文件内的帐号手工访问线上数据库 。
2.【强制】禁止非DBA对线上数据库进行写操作,修改线上数据需要提交工单,由DBA执行,提交的SQL语句必须经过测试 。
3.【强制】禁止在线上做数据库压力测试 。
4.【强制】禁止从测试、开发环境直连线上数据库 。
5.【强制】禁止在主库进行后台统计操作,避免影响业务,可以在离线从库上执行后台统计? 。
十、流程规范
1.【强制】所有的建表操作需要提前告知该表涉及的查询sql 。
2.【强制】所有的建表需要确定建立哪些索引后才可以建表上线 。
3.【强制】所有的改表结构、加索引操作都需要将涉及到所改表的查询sql发出来告知DBA等相关人员 。
4.【强制】在建新表加字段之前 , 要求至少要提前3天邮件出来,给dba们评估、优化和审核的时间 。
5.【强制】批量导入、导出数据需要DBA进行审查 , 并在执行过程中观察服务 。
6.【强制】禁止有super权限的应用程序账号存在 。
7.【强制】推广活动或上线新功能必须提前通知DBA进行流量评估 。
8.【强制】不在业务高峰期批量更新、查询数据库 。
9.【强制】隔离线上线下环境(开发测试程序禁止访问线上数据库) 。
10.【强制】在对大表做表结构变更时,如修改字段属性会造成锁表 , 并会造成从库延迟,从而影响线上业务,必须在凌晨后业务低峰期执行,另统一用工具pt-online-schema-change避免锁表且降低延迟执行时间 。
11.【强制】核心业务数据库变更需在凌晨执行 。
12.【推荐】汇总库开启Audit审计日志功能 , 出现问题时方可追溯 。
13.【强制】给业务方开权限时,密码要用MD5加密 , 至少16位 。权限如没有特殊要求,均为select查询权限,并做库表级限制 。
14.【推荐】如果出现业务部门人为误操作导致数据丢失,需要恢复数据,请在第一时间通知DBA , 并提供准确时间,误操作语句等重要线索 。
15.【强制】批量更新数据,如update,delete 操作,需要DBA进行审查,并在执行过程中观察服务 。
16.【强制】业务部门程序出现bug等影响数据库服务的问题,请及时通知DBA便于维护服务稳定 。
17.【强制】线上数据库的变更操作必须提供对应的回滚方案 。
18.【强制】批量清洗数据,需要开发和DBA共同进行审查,应避开业务高峰期时段执行 , 并在执行过程中观察服务状态 。
19.【强制】数据订正如删除和修改记录时,要先 select ,确认无误才能执行更新语句,避免出现误删除 。
作者丨修冶
来源丨公众号:阿里云开发者(ID:ali_tech)

【用惨痛教训换来的156条MySQL设计规约】


推荐阅读