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


相关推荐

  • LeetCode – Refresh – Valid Palindrome

    LeetCode – Refresh – Valid Palindrome

    2021年9月4日
    77
  • PHP程序连接Redis报read error on connection问题

    PHP程序连接Redis报read error on connection问题

    2021年10月27日
    55
  • android 短信验证码的实现

    android 短信验证码的实现公司用的短信验证码是Mob.com网址:http://www.mob.com进入网站注册登录之后进入后在上面有应用是让选择android还是ios之类的,点击下载SDK–选择免费短信验证SDK,下载之后大家可以在快速继承那看到官方提供的方法下面对其步骤解读下1 导入SDK短信SDK使用如下方式完成集成。具体步骤如下:将SMS_

    2022年7月25日
    7
  • 8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

    本文讲的是利用nodejs以及相关库,爬取JRS爆照区内的爆照贴,并保存相关数据到本地。依赖选择constsuperagent=require(‘superagent’);//nodejs里一个非常方便的客户端请求代理模块constcheerio=require(‘cheerio’);//Node.js版的jQueryconstasync=r…

    2022年4月9日
    57
  • 学习Java有什么用 可以从事哪些工作

    学习Java有什么用 可以从事哪些工作Java开发应用广泛,是目前互联网行业不可缺少的语言,因此越来越多的人选择学习Java。对于初学者而言,学完Java除了可以从事Java开发之外,还可以做哪些具体的工作岗位呢?一、Android应用 Android是一种基于Linux的自由及开放源代码的操作系统,其源代码是Java。目前企业级特别大的应用,都需要学Java。而Java做安卓开发不单单是指系统,还有APP,在Andro…

    2022年7月7日
    28
  • linux部署tomcat项目详细教程(安装linux到部署tomcat)

    linux部署tomcat项目详细教程(安装linux到部署tomcat)近来想要研究下linux,所以就搭了个linux系统来配置服务器玩玩。这里分了个目录,如果已经安装好虚拟机或者linux系统的小伙伴可以直接跳过前面的安装介绍,直接看部署。文章目录一、总步骤说明二、安装虚拟机三、创建linux系统一、总步骤说明下载需要的材料(该博客有提供),这里我用到的主要有1)虚拟机Vmware,2)linux镜像文件CentOS-6.5-x86_64-bin-DVD1.iso3)服务器apache-tomcat-7.0.105.tar.gz4)jdk7u79linuxx

    2022年7月18日
    18

发表回复

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

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