Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL数据库开发规范知识点速查

MySQL数据库开发规范知识点速查

作者头像
linxinzhe
发布于 2018-04-16 02:56:19
发布于 2018-04-16 02:56:19
1.6K0
举报
文章被收录于专栏:林欣哲林欣哲

数据库设计规范

  • 命名规范
  • 基本设计规范
  • 索引设计规范
  • 字段设计规范
  • SQL开发规范
  • 操作行为规范

命名规范

  • 对象名称使用小写字母并用下划线分割
  • 禁止使用MySQL保留关键字
  • 见名识义,最好不超过32个字符。例如:用户数据库,mcuserdb(公司+user+db),用户表,useraccount
  • 临时表,以tmp为前缀,以日期为后缀
  • 备份表,以bak为前缀,以日期为后缀
  • 存储相同数据的列名和列类型必须一致(关联列类型相同用索引高效)

基本设计规范

  • 所有表用Innodb存储引擎
    • 支持事务
    • 行级锁
    • 更好的恢复性
    • 高并发的性能更好
  • 数据库和表的字符集统一使用UTF-8,统一可避免乱码
  • 所有表和字段添加注释( COMMENT从句)
  • 尽量控制单表数据量,建议控制在500万以内。(不是MySQL的限制,是经验值)
    • 处理方式:历史数据归档、分库分表
  • 谨慎使用MySQL分区表
    • 分区表:在物理上表现为多个文件,在逻辑上表现为一个表
    • 问题:谨慎选择分区键,跨分区查询效率可能更低
    • 建议:采用物理分表的方式管理大数据
  • 尽量做到冷热数据分离,减小表的宽度
    • 限制:一个表最多4096列
    • 减少磁盘IO,保证热数据的内存缓存命中率
    • 利用更有效的缓存,避免读入无用的冷数据
    • 建议:经常一起用的列放在一个表中
  • 禁止在表中建预留字段
    • 无法见名识义
    • 无法确定数据类型
    • MySQL修改预留字段比增加还麻烦,涉及对表的锁定
  • 禁止在数据库中存储图片,文件等二进制数据
  • 禁止在线上做数据库压力测试
  • 禁止从开发或测试环境直接连接生产环境数据库

索引设计规范

  • 限制每张表的索引数量,建议单表索引不超过5个
    • 索引增加查询效率,但是降低插入和更新效率
    • 禁止给每一列都建立单独的索引
  • 每个Innodb表必须有一个主键
    • 不使用更新频繁的列作为主键,不使用多列主键,因为更新后就涉及对索引顺序的修改,频繁更新会导致频繁调整,导致降低性能
    • 不使用UUID,md5,hash字符串作为主键,因为这类哈希不保证插入时递增的特性
    • 建议:使用自增ID值
  • 在哪建立索引?
    • SELECT, UPDATE, DELETE语句中的WHERE从句中的常出现的列
    • ORDER BY, GROUP BY, DISTINCT中的字段
    • 多表JOIN的关联列
  • 建立索引的顺序?
    • 区分度差不多的情况下,尽量把字段长度小的列放在联合索引的最左边
    • 两者还差不多的情况下,使用最频繁的列放在联合索引的左侧
    • 区分度最高的列放在联合索引的最左侧。区分度计算:Selectivity = Distinct Values / Total Number Rows,区分度最大的就是主键(区分度为1)
  • 避免建立冗余索引和重复索引
    • 重复索引例子: primary key(id),index(id),unique index(id)这三个就重复建立id的索引了
    • 冗余索引例子: index(a,b,c),index(a,b),index(a)对于a来说就重复建立了。
  • 对于频繁的查询优先考虑使用覆盖索引。
    • 覆盖索引:包含了所有查询字段的索引
    • 避免Innodb表进行索引的二次查找
    • 可以把随机IO变为顺序IO加快查询效率
  • 尽量避免使用外键
    • 外键是用于保证数据的参照完整性,但建议在业务端实现。
    • MySQL外键会建立索引
    • 不建议使用外键约束
    • 表与表之间的关联键建立索引是必须的
    • 外键会影响父表和子表的写操作而降低性能(检查约束导致的)

字段设计规范

  • 优先选择符合存储需要的最小的数据类型
    • 将字符串转化为数字类型存储
    • 非负的用无符号整形
    • VARCHAR(N)的N代表是字符数,不是字节数,使用UTF-8存储汉字 VARCHAR(255)=765个字节
    • 过大的长度会消耗更多的内存
  • 避免使用 TEXTBLOB数据类型
  • 避免使用 ENUM数据类型
    • 修改 ENUM值会导致表结构的修改
    • ENUMORDER BY需要额外操作,效率低
    • 禁止使用数值作为ENUM的枚举值
  • 尽可能把所有列定义为 NOT NULL
    • 索引 NULL列需要额外空间,占用更多空间
  • 使用 TIMESTAMPDATETIME类型存储时间。不要用字符串存储日期类型(无法利用内置日期函数而且占用更多空间)
  • 涉及财务的金额,必须用 DECIMAL类型
    • 精确浮点,计算不会丢失精度
    • 占用空间由定义的宽度决定
    • 可用于存储比 BIGINT更大的整数数据

SQL开发规范

  • 建议使用预编译语句进行数据库操作
    • 只传参数,多次使用,执行更快
    • 可避免动态SQL注入问题
  • 避免数据类型的隐式转换
    • 会导致索引失效
  • 合理利用存在索引,而不是盲目增加索引
  • 充分利用表上已经存在的索引
    • 避免使用双%号的查询条件,如 a LIKE'%123%'
    • 一个SQL只能利用到复合索引中的一列进行范围查询
    • 使用 LEFT JOINNOT EXISTS 来优 NOT IN操作(可能导致索引失效)
  • 禁止跨库查询,程序连接不同的数据库使用不同的账号
    • 数据库迁移和分库分表留出余地
    • 降低业务耦合度
    • 避免安全风险
  • 禁止使用 SELECT*,需要用 SELECT<字段列表>查询
    • *返回不需要的字段
    • 无法使用覆盖索引
  • 禁止使用不含字段列表的INSERT语句
    • 禁止这种 INSERT INTO t VALUES('a','b','c')应该带上 INSERT INTO t(c1,c2,c3)VALUES('a','b','c')
  • 避免使用子查询,可以把子查询优化为 JOIN操作
    • 子查询的结果集无法使用索引
    • 子查询会产生临时表操作,如果子查询数据量大则严重影响效率
  • 避免使用 JOIN关联太多的表
    • JOIN一个表会多占用一部分内存(joinbuffersize)
    • 会产生临时表,影响查询效率
    • MySQL最多允许关联61个表,建议不超过5个
  • 减少同数据库的交互次数
    • 数据库更适合处理批量操作
    • 合并多个操作,可以提高处理效率
  • 使用 IN代替 OR
    • IN的值不超过500个
    • IN的操作可以有效的利用索引
  • 禁止使用 ORDER BY rand()进行随机排序
    • 会加载到内存再排序,消耗大量CPU和IO和内存
    • 建议:在程序中生成随机值,再获取数据
  • 禁止WHERE从句中队列进行函数转换和计算
    • 导致无法使用索引
  • 明显不会有重复值的用 UNION ALL而不是 UNION
    • UNION会把所有数据放到临时表中后再进行去重操作
    • UNION ALL则不会做去重操作
  • 拆分复杂的大SQL为多个小SQL
    • 一个SQL只用一个CPU计算
    • 拆分后可以并行执行

操作行为规范

  • 超过100万行的批量写操作,要分批多次进行操作
    • 注意之前提到的尽量合并操作是针对查询
    • 大批量的可能会造成主从延迟
    • binlog日志为row格式时会产生大量的日志
    • 避免产生大事务操作,造成锁定和大堵塞。
  • 对大表数据结构的修改一定要谨慎,会造成严重的锁表操作。尤其是生产环境,是不能忍受的。
  • 对于大表使用pt-online-schema-change(PERCONA公司的工具)修改表结构
    • 复制出一个新表,再修改新表为原表名称
    • 避免主从延迟
    • 避免修改时的锁表
  • 禁止程序使用super权限的账号
    • super可以在达到最大连接限制连上用户,但是只能有一个super账号连接,应该交给DBA处理问题用,不应被程序占用
  • 数据库账号遵循权限最小原则
    • 只需要查询就别给其他操作权限
    • 数据库账号只能在同一个DB下使用,不允许跨库
    • 程序的账号原则上不允许有drop权限

参考

  1. 高性能可扩展MySQL数据库设计及架构优化,sqlercn,https://coding.imooc.com/class/79.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 林欣哲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
时间都去哪儿了-技术人员的时间管理
是不是有这样一种感觉,明明一天开始的时候计划要做很多事情,但是忙忙碌碌一天之后发现,杂七杂八的事情做了一堆,重要的事情却一件没完成。
奎哥
2018/08/31
4020
时间都去哪儿了-技术人员的时间管理
时间管理笔记(三)
昨天,我们谈到了如何让自己专注于自我真正的目标,而不再那么容易被感觉拐跑,并形成行动的正循环。 image 不过,在昨天的结尾,我们提到了:如果规划不当的话,正循环是持续不了太久的。 所以,今天我们将
iOSDevLog
2018/05/17
9860
我的时间管理经验
你是不是还在使用todolist管理每天要做的事情?你是不是感觉自己每天忙忙碌碌但是又不知道忙了些啥?今天这篇文章用于分享下我的时间管理经验,希望你能有所收获。
阿杜
2019/05/13
6930
我的时间管理经验
时间管理:《从番茄 ToDo 到 Forest 又回到番茄》
又过去 19 天了,我这半死不活的公众号又要复苏了,今天的内容跟大家都经常听的 “番茄工作法” 有关,(小声哔哔:不知道啥叫番茄工作法是啥?文末会送书《番茄工作法图解:简单易行的时间管理方法》)。
Java宝典
2021/01/14
1.3K0
时间管理:《从番茄 ToDo 到 Forest 又回到番茄》
带你破解时间管理的谜题
你是不是还在使用todolist管理每天要做的事情?你是不是感觉自己每天忙忙碌碌但是又不知道忙了些啥?今天这篇文章用于分享下我的时间管理经验,希望你能有所收获。
青南
2019/05/14
6010
带你破解时间管理的谜题
25分钟改变你的工作效率:番茄工作法
少年,你是不是每5分钟就会拿起一次手机?你是不是每天忙忙碌碌但最后好像什么也没干?你是不是日复一日的加班感觉身体被掏空?
Allen Cheng
2018/09/10
1.5K0
25分钟改变你的工作效率:番茄工作法
新技术学习中的时间管理:如何高效安排学习和工作?
在现代快节奏的工作环境中,如何高效地安排学习时间,尤其是在学习新技术的过程中,已经成为了许多人面临的挑战。忙碌的工作、无尽的任务和琐事可能让你感到无法腾出时间来提升自己,尤其是当你有很多新技能要掌握时,常常感觉一切都成了拖延症的源头。但其实,只要合理管理时间,不仅可以避免这些任务的干扰,还能确保自己在持续学习的同时,不会感到压力山大。
bug菌
2025/03/25
1300
新技术学习中的时间管理:如何高效安排学习和工作?
时间管理的道法术器
我曾经写过一篇文章:不会管理时间,怎么办?其中介绍了时间管理方法无效的 3 个原因,并有针对性地总结了 3 个对策。
数据森麟
2021/01/25
8450
时间管理的道法术器
你真的了解番茄钟么
无论是内部打断还是外部打断,番茄工作法都着重强调要保证在25分钟的时间内专注做同一件事情。
Datawhale
2019/07/08
1.2K0
你真的了解番茄钟么
IT工程师的自我管理 | 洞见
工作多年,我们见识到了很多厉害的人,他们可以兼顾家庭和工作,合理安排自己的事务和时间,能冷静的处理突发事件且理智的做出决策,把所有事情安排的妥妥当当。最初我以为这种能力来源于性格、情商甚至是天赋,因为
ThoughtWorks
2018/04/13
6620
IT工程师的自我管理 | 洞见
快来看!DeepSeek推荐的时间管理方式
首先是可以提高工作效率,通过合理规划时间,可以集中精力完成重要任务,避免拖延和浪费时间。例如,使用番茄工作法将工作时间分割成25分钟的高度集中时段,能有效提高工作效率。
闫同学
2025/04/11
1420
工作时间管理之番茄工作法
互联网时代,注意力变成越来越宝贵的资源,因为在我们身边,分散注意力的恶魔实在是太多了,朋友圈、微博、各种游戏、各种视频、各种新闻,昨晚章鱼回家的时候发现,我家的电梯里都放了一个显示屏,轮番放着炫目的广告。
一个会写诗的程序员
2020/05/08
7950
如何在 FlowUs、Notion 等笔记软件中使用「番茄工作法」?
在我们的日常生活中,你会接触到各种各样的生产力系统。比如,GTD、艾森豪威尔矩阵、看板,以及一些更为复杂的生产力系统。然而,在经历过各种折腾以后,人们可能会发现自己并不需要多么精巧和复杂的生产力系统,老老实实以时间块为单位聚精会神地去工作便能收获高效率。对此,番茄钟工作法便是一种久经考验、简单好用的生产力方法。
数字花园
2022/06/22
6100
如何在 FlowUs、Notion 等笔记软件中使用「番茄工作法」?
谈谈如何构建自己的时间管理系统?
我们总说要学会利用碎片时间,可是要怎么利用呢?在此之前,我们先来讨论一个问题,当你有了碎片时间,你会干什么?
我被狗咬了
2020/03/05
1.1K0
一番码客-番茄时钟
认真做过事的同学应该都有体会,减少被打断,专注的做一件事才是高效的做事方式。 阻碍我们专注的通常有两种情况: 一是外部中断,比如专心写代码的你被产品过来提需求,比如专心游戏的你被喊回家吃饭; 二是内部中断,比如专注了一个小时写代码的你感到了腰酸腿疼、注意力涣散,比如专注刷抖音三个小时的你感到重复单调、索然无味。
efonfighting
2019/08/02
8040
一番码客-番茄时钟
【干货】扎克伯格的26张PPT,让工作提质增效
雷军曾经说过:不要用战术的勤奋掩盖战略的懒惰,这句话不仅适用于战场,也同样适用于企业管理。本文整理了全球最年轻亿万富豪Facebook创始人马克·扎克伯格亲自做的26张PPT,可以说这26张PPT是小
钱塘数据
2018/03/27
1K0
【干货】扎克伯格的26张PPT,让工作提质增效
【Dev Club 话题讨论】程序员的成长离不开哪些软技能?
Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。定期会举行嘉宾分享,话题讨论等活动。 本期讨论话题为:程序员的成长离不开哪些软技能? 首先,什么是软技能? 软技能就是激活人资的能力,即是调动别人的资源和知识的能力以及调动自己知识进行创造性思维的能力!软技能能力值越高,处理事情的能力就越强,它是衡量一个人处理事情能力的量表!这里的资源指:知识和朋友。软技能实际上是指那些“不易看见的技能”,是一个人“激发自己潜能和通过赢得他人认可和合作放大自己的资源,以获得
腾讯Bugly
2018/03/23
7400
感觉自己没工作效率?来看看Facebook内部的26张PPT,让你快速提升工作状态!~看完比喝浓缩红牛管用!
3、当你在状态时,就多干点;不然就好好休息:有时候会连着几天不是工作状态,有时在工作状态时却又能天天忙活 12 小时,这都很正常的。
Chris生命科学小站
2023/02/28
2160
感觉自己没工作效率?来看看Facebook内部的26张PPT,让你快速提升工作状态!~看完比喝浓缩红牛管用!
扎克伯格为提高员工工作效率,亲自做了这 26 张 PPT ,值得收藏
源 / Facebook 全球最年轻亿万富豪宝座的Facebook创始人马克·扎克伯格,为了提升员工的工作效率,亲自做了这26张PPT。 本文分享了来自Facebook内部的26张PPT,希望能让你快速提升工作状态! 1、时间常有,时间在于优先。 2、时间总会有的:每天只计划 4~5 小时真正的工作。 3、当你在状态时,就多干点;不然就好好休息:有时候会连着几天不是工作状态,有时在工作状态时却又能天天忙活 12 小时,这都很正常的。 4、重视你的时间,并使其值得重视:你的时间值 1000
顶级程序员
2018/05/03
8990
扎克伯格为提高员工工作效率,亲自做了这 26 张 PPT ,值得收藏
那些漂亮的不像实力派的时间管理软件
此外,它还支持任务的分割,支持任务优先级,并且支持模板,总之对于待办任务的管理,它绝对是专家中的专家。
程序那些事儿
2023/03/07
6220
那些漂亮的不像实力派的时间管理软件
推荐阅读
相关推荐
时间都去哪儿了-技术人员的时间管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档