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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 谈磁盘列阵 raid0 raid1 raid3 raid5 raid10简介及区别

    谈磁盘列阵 raid0 raid1 raid3 raid5 raid10简介及区别转自:https://www.fengjunzi.com/blog-25108.htmlRAID简介随着服务器在企业的应用越来越广泛,数据安全,数据存储,数据恢复,存储速度等方面对企业用户来说越来越重要,而RAID卡在此过程中起着至关重要的作用,RAID卡本身的性能和特点往往会被一些用户忽视,而服务器厂商为节约成本也会搭配一些比较初级甚至一些小品牌的RAID卡产品,在使用过程中出现问题时用…

    2022年7月15日
    21
  • android中gravity和layoutgravity的区别[通俗易懂]

    android中gravity和layoutgravity的区别[通俗易懂]android中gravity和layoutgravity的区别_百度知道1个回答-最新回答:2015年02月07日-1人觉得有用[专业]答案:android:gravity:设置的是控件自身上面的内容位置android:layout_gravity:设置控件本身相对于父控件的显示位置。

    2022年7月26日
    5
  • 操作系统核心原理之内存管理思维导图

    操作系统的两个角色分别是魔术师和管理者,在管理者这个角色中,除了CPU之外,内存是操作系统要管理的另外一个重要资源。内存管理需要达到两个目标:一是地址保护,即一个程序不能访问另一个程序的地址空间。二是

    2021年12月19日
    54
  • django动态路由_路由器如何建立路由表

    django动态路由_路由器如何建立路由表自定义路径转换器有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器django内置的路径转换器源码解析在我们自定义路由转

    2022年7月31日
    8
  • mysql 数据_MySQL和SQL

    mysql 数据_MySQL和SQL附带国内精确到市,国外的精确到省吧。下载这里的:https://download.csdn.net/download/luolincsdn/10675557有的下载都没用,想一想还是放出来比较好。这是数据表:DROPTABLEIFEXISTS`ht_location`;CREATETABLEIFNOTEXISTS`ht_location`(`id`int(11…

    2022年9月30日
    5
  • dosbox基础使用[通俗易懂]

    dosbox运行程序1、mountc:d:\masm64把d盘masm64的内容挂在到c盘中2、c:进入c盘3、masmname.asm编译name的asm文件,后面要敲回车masmname.asm;编译name的asm文件,后面不用敲回车4、linkname连接name的文件,后面要敲回车linkname;连接name的文件,后面不用敲回车5、name运行name的文件dubug程序1、挂载、进入c盘步骤和前面一样2、debugname.exe3、输入命令

    2022年4月15日
    143

发表回复

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

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