MySQL开发规范.pdf

MySQL开发规范.pdf

大家好,又见面了,我是全栈君。

禁止项:

1、 禁止使用 select * 等查询

     当查询所有字段(select *)会导致下列问题
        1. 增加网络带宽消耗
        2. Select *必然会导致回表查询/返回数据,使覆盖索引失效

        3. 如果表结构有修改比如增加多列,返回多余数据比较危险

2、 禁止库名、表名、字段名使用 MySQL 保留字

当库名、表名、字段名等属性含有保留字时,SQL 语句必须用反引号引用属性名称,这将使得 SQL 语句书写、SHELL 脚本中变量的转义、在线修改表结构等变得非常复杂。

3、 禁止使用分区表
Mysql 分区表技术还是不是很成熟,而且对分区键有严格要求,分区表变大后对于表备份恢复都有很大困难,建议在业务端使用 sharding 技术。

4、 禁止在数据库中存储明文密码
如果需要存储 MySQL 密码可以用 MySQL 内置函数 password()对明文密码进行 MD5 进行加密。

5、SQL 中禁止出现 now()、rand()、sysdate()、current_user()等不确定结果的 函数。

建议不确定的时间在程序层取出时间,语句级复制场景下,引起主从数据不一致; 不确定值的函数,产生 的 SQL 语句无法利用。

6、 禁止使用 VARBINARY、BLOB 存储图片、文件等,使用 VARCHAR(N),N 尽 量可能小

7、 禁止在列上进行运算
在列上运算将导致 Mysql 索引失效而进行全表扫描。

规范项:
1、建表字符集使用 UTF8 或者 UTF8mb4

    UTF8 统一而且通用,不会出现转码出现乱码风险。如果有表情符号需求的,可以使用 utf8mb4

2、表必须有主键,推荐使用 UNSIGNED 自增列作为主键

表没有主键,INNODB 会默认设置隐藏的主键列;没有主键的表在定位数据行时效率会非常低而且降低基于行复制的效率。在建表时务必定义一个自增列做主键(与业务逻辑无关,而应用程序的数据如果有唯一的候选列可以做成唯一键),再次重申 INNODB 存储引擎中每张表一定要有一个于业务无关的自增列做主键。

建议项:

1、建议慎重使用前缀匹配的模糊查询

前缀匹配会导致直接全表扫描或全索引扫描,性能最差,无任何扩展,基本不可接受。

2、建议所有字段均定义为 NOT NULL,设置 default 值。

定义为 Not Null 原因如下:

  1. MySQL 数据库中每个为 NULL 的列都需要额外的 1 个字节进行存储,浪费空间资源。

  2.  B 树索引时不会存储 NULL 值,如果索引字段可以为 NULL,索引效率会下降。

  3. 建议用 0、特殊值或空串代替 NULL 值。

3、建议查询中避免隐式转换
MySQL 中如果查询字段与表定义字段不同则会发生隐式转换,从而无法用到索引导致查询效率低下。

4、建议不要在 MySQL 数据库中存放业务逻辑。

数据库是有状态的服务,变更复杂而且速度慢,如果把业务逻辑放到数据库中,将会限制业务的快速发展。建议把业务逻辑提前,放到前端或中间逻辑层,而把数据库作为存储层,实现逻辑与存储的分离。

5、建议不要使用子查询
对于子查询,mysql 会对子查询结果返回给外部表,并对外部表进行全表扫描

6、建议将大字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据

当我们的表中存在类似于 TEXT 或者是大的 VARCHAR 类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO次数,也能大大提高内存中的缓存命中率。

7、建议用 in() /union 替换 or,并注意 in 的个数(个数多少依照具体情况而定)

8、建议尽量不使用 mysql 存储过程、触发器、函数等(依照具体情况而定)

容易将业务逻辑和 DB 耦合在一起,并且对于目前数据量存储过程、触发器、函数等没有任何优势(存储过程、函数对大数据量的处理和复杂业务逻辑很有优势),而且 mysql 存储过程还有一定 BUG。

如果喜欢这篇文章,请点个关注,分享给更多的人,小编将持续更新,谢谢啦!

MySQL开发规范.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111462.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【9】进大厂必须掌握的面试题-DevOps面试

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 Q1。DevOps和Agile之间的根本区别是什么? 下表中列出了两者之间的差异。 特征 DevOps–…

    2021年6月23日
  • spring aop面向切面原理,用处和实力讲解

    spring aop面向切面原理,用处和实力讲解spring aop面向切面原理,用处和实力讲解

    2022年4月23日
  • 系统功能测试用例模板「建议收藏」

    系统功能测试用例模板「建议收藏」系统功能测试用例模板 用例名称 订单支付_银联卡支付_支付银行卡处于欺诈名单当中 用例目录 订单支付/银联卡支付/ 用例编号 Payment037 功能模块 结账支付 优先级别 2 相关需求 《结账支付功能规格说明》 数据准备 余额充足的支付用银联银行卡、已注册的前台用户 前置条件 1.用户已登录 2.用户已将商品加入购物车并触发订单结算流程 3.用户将订单支付流程推进至用银行卡支付节点 步骤 测试

    2022年7月17日
  • 用导数的定义求指数函数的导数_对数函数导数的推导

    用导数的定义求指数函数的导数_对数函数导数的推导指数函数的性质  先来复习一下中学的课程:指数函数的导数  对f(x)=ax求导:  ax右侧的那个极限似乎没有办法继续简化了,如果这个极限看作关于a的函数(之所以将极限看作关于a的函数,是因为在这个极限中,a是未知的,Δx是已知的):  函数在某一点导数的几何意义是该点处切线的斜率,所以M(a)也就是ax在x=0处切线的斜率。  如果y=2x,…

    2022年10月24日
  • 大数据建模培训Python

    大数据建模培训Python我国的知名人士:“马云”以前在2015年提及互联网技术将要由IT转至DT,什么叫DT,说白了DT便是数据信息加技术性。现如今是个实实在在的互联网时代,互联网大数据围绕了大家的吃穿住行,能够这么说,互联网大数据是现阶段最珍贵的数据信息藏宝。什么叫Python网络爬虫?Python网络爬虫又叫爬虫技术,有关Python网络爬虫,大家必须了解的有:1、Python基本英语的语法2、HTML网页页面的內容抓取(数据收集)3、HTML网页页面的数据信息获取(数据预处理)4、Scrapy架构

    2022年5月31日
  • servlet的基本原理_简述arp的工作原理

    servlet的基本原理_简述arp的工作原理Web技术成为当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。因而掌握Servlet的工作原理是成为一名合格的JavaWeb技术开发人员的基本要求。本文将带你认识JavaWeb技术是如何基于Servlet工作,以Tomcat为例了解Servlet容器是如何工作的?一个Web工程在Servlet容器中是如何启动的?

    2022年10月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号