数据库设计规范(五大点)

一、表设计规范

  1. 临时表使用tmp为前缀开头,时间戳结尾

  2. 备份表使用bak为前缀开头,时间戳结尾

  3. 所有表使用innodb储存引擎支持事务,行级锁,恢复性,高并发性能更好

  4. 单表数据量控制在500万以内
    500万只是一个大致的标准。具体需要根据硬件的性能,以及表结构决定。500万内标准来自阿里《java开发规范》,其中也补充到。如果三年后数据库达不到500万,则不需要考虑分表分库

  5. 禁止表中创建预留字段

    1. 不能见名知义
    2. 不能确认存储的数据类型
    3. 修改字段类型会锁表
  6. 禁止存储图片和文件
    数据读写图片以及文件远不如文件系统处理的速度,备份,迁移数据库加剧耗时,数据库更擅长于存储数据,图片文件一般上传至云服务器中,将URL存储到数据库中更合理。

  7. 禁止在线上做数据库压力测试

  8. 避免使用外键约束

    1. 外键的优点:
      • 保证了相关联的表之间数据的完整性。
      • 方便级联操作
      • 保证数据完整性交给数据库,减少了程序代码量
    2. 外键的缺点:
      • 性能问题: 每次操作数据库,数据库会自行校验操作数据可行性
      • 并发问题: 每次校验数据完整,并发情况下容易导致死锁
      • 灵活性问题: 数据库迁移,或者数据库手动修改,因为外键校验数据完整性,数据库经常拒绝用户操作数据,需要梳理外键关系,再行操作。
        综上,建议将数据库外键逻辑使用程序代码实现。而不是交给数据库实现。
  9. 创建表尽可能使用utf8或者utf8mb4字符集,校验字符集使用utf8_general_ci或者utf8mb4_general_ci。ci表示不区分大小写。utf8mb4_general_ci准确度稍差,但是校对速度较快

  10. 添加注释,在建表语句comment中指定

二、字段设计规范

  1. 优先选择符合储存需要的最小数据类型,尽量将字符串转为数字类型
    数字类型没有字符集以及校验字符集,占用的内存,cpu资源较少。如主机ip,业务编号,尽量使用数字存储

  2. 避免使用TEXT,BLOB数据类型(查询排序时,启用io消耗资源,且只支持前缀索引),建议分离到单独扩展表中

  3. 避免使用enum数据类型,建议使用char或者tinyint

  4. 尽量避免列为null值

    • 索引null列时需要额外的空间保存
    • 进行比较和计算时需要做额外的特殊处理
  5. 表字段字符集和表保持一致,尽可能使用utf8或者utf8mb4字符集,校验字符集使用utf8_general_ci或者utf8mb4_general_ci

  6. 添加注释,在建表语句comment中指定,数据字典字段最好说明状态值。即使有数据库文档

三、索引设计规范

  1. 单表索引不超过5个,禁止给表中的每一列建立索引(降低mysql优化器评估效率。增加生成查询计划的时间。)

  2. 不使用频繁修改的列作为主键,不使用uuid,md5,hash作为主键(不能保证下一行数据比上一行数据的主键值大。会导致数据逻辑调整增加io以及cpu资源的消耗)

  3. 将索引加载where从句中的列,包含order by 、group by、distinct中的列,多表关联的join列表上

  4. 如何选择索引的顺序

    1. 区分度最高的列放在联合索引的最左测
    2. 尽量把字段长度小的列放在最左测
    3. 使用最频繁的列放在最左侧
  5. 避免建立冗余索引以及重复索引

四、sql开发规范

  1. 使用预编译语句。可重复使用执行计划,防止sql注入

  2. 避免数据类型的隐式转换(索引失效)

CREATE TABLE `test` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `username` varchar(255)  NULL DEFAULT NULL COMMENT '用户名',
        PRIMARY KEY (`ID`) USING BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4  ROW_FORMAT = Dynamic;

上面创建test表,更新符合id条件的username

    update test set username = '更新名称' where id = '1'

id = '1',表设计中id为int类型,而更新sql中传的varchar类型,导致隐式转换
放弃主键索引,全面扫描,实际测试100万数据更新需40s左右。

  1. 避免使用双%号查询(索引失效)
  2. 使用left join 或者not exists优化not in (索引失效)
  3. 禁止跨库查询
    1. 为数据库迁移和分库分表留出余地
    2. 降低业务耦合度
    3. 避免权限过大产生数据风险
  4. 禁止使用select * 查询
    1. 效果更多的cpu io 以及网络资源
    2. 无法使用覆盖索引
  5. 禁止使用不含字段列表的insert语句
  6. 禁止使用子查询,可以把子查询改为join
    1. 子查询结果集不能使用索引
    2. 产生临时表操作,效果过多的cpu io资源
  7. 避免使用过多的join,建议不超过5个
  8. 减少同数据库的链接次数(数据库更适合处理批量操作)
  9. 使用in代替or,in使用索引效率更高
  10. 禁止使用order by rand(),消耗大量cpu io以及内存资源
  11. where 从句中禁止对列进行函数转换和计算(索引失效)
  12. 将明显不会有重复值时使用union all 而不是union(union会把所有数据放到临时表并去重)
  13. 将复杂sql拆分为小sql

五、数据操作行为规范

  1. 超过100万行的批量写操作,要分批多次进行操作

    1. 避免产生大事务操作
    2. 产生大量的日志
    3. 造成严重的主从延迟
  2. 修改大数据表结构,使用pt-online-schema-change工具

----------------- 文章如有问题,请下方回复指出,感谢查阅😁 -----------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335