一:新建表和字段建议:

1.所有数据表和字段要有清晰的注释,字段说明
  说明:不管是创建者还是其他开发或者后续维护者都能清楚知道数据表和字段定义的含义
 
2.表名、字段名使用小写字母或数字,禁止出现数字开头
  说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写,为了避免出现不必要的麻烦,统一使用小写
 
3.每个列都设置为not null(如果列为BLOB/TEXT类型的,则这个列不能设置为NOT NULL),且定义默认值
  说明:3.1:NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回非空行的结果集
  3.2:使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL
  3.3:当用count函数进行统计时,NULL 列不会计入统计
  3.4:因为NULL的列使得索引,索引统计和值比较都更复杂,可为NULL的列会使用更多的存储空间,在mysql里也需要特殊处理,当可为NULL的列被索引时,每个索引记录需要一个额外的字节,如果计划在列上建索引,应该避免将列设计为NULL。
 
4.每个表有自增列id且为主键,使用无符号类型unsigned,不作业务逻辑使用
  说明:4.1:避免存储负值,且扩大了表示范围
  4.2:如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面
 
5.表达是否概念的列,使用is_xxx的方式命名,数据类型使用unsigned tinyint(1表示是,0表示否)
  例如:is_valid,1.表示有效 0.表示无效
 
6.禁止使用mysql保留字,例如desc,range,match,action,add,alter,all..等等
  更多保留字可以参考mysql官方文档说明:https://dev.mysql.com/doc/refman/5.7/en/keywords.html
 
7.varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率
 
8.单表行数 超过500万行或者表单容量超过2GB,才推荐进行分库分表
 
9.命令规范:主键索引名以pk_字段名;唯一索引名uk_字段名;普通索引名idx_字段名;临时表则以tmp为前缀
 
10.小数类型为decimal,禁止使用float和double
  说明:float和double的存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储
 
11.字段允许适当冗余,以提高查询性能,冗余字段应遵循:1)不是频繁修改的字段。2)不是varchar超长字段,更不能是text字段。
 
12.InnoDB和MyISAM存储引擎表,索引类型选择BTREE;MEMORY表可以根据需要选择HASH或者BTREE类型索引。
 
13.在建立索引时,多考虑建立联合索引,并把区分度最高的字段放在最前面,这样可以更高效检索数据
 
14.合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度
 
对象
年龄区间
类型
字节
表示范围
150之内
unsigned tinyint
1
无符号:0-255
数百岁
unsigned smallint
2
无符号:0-65535
恐龙化石
数千年
unsigned int
4
无符号:0-42.9亿
太阳
约50亿年
unsigned bigint
8
无符号:0-约10的19次方
 

二:增删改查好习惯

 
1.SELECT语句指定具体字段名称,禁止写成*,select *会将不该读的数据也从MySQL里读出来,造成不必要的带宽压力
 
2.分页查询,当limit起点较高时,可先用过滤条件进行过滤。如select f1,f2,f3 from table1 limit 20000,20;优化为: select f1,f2,f3 from table1 where id>20000 limit 20
 
3.where条件里等号左右字段类型一致,否则无法利用索引
 
4.在多表join中,尽量选取结果集较小的表作为驱动表,来join其他表
 
5.插入列列表与值列表个数相同,上面二者的个数需要相同,如果没有指定列列表,则值列表长度要与表列数相同。
 
6.更新删除影响行数不要太大,如果太大,进行细粒度拆分
 
7.更新,删除语句记得随手写好where条件(你想删库吗?哈哈)
 

欢迎大家补充,一起建立更优雅的数据规范

用了这么多年MySql,这些好习惯你用过哪些的更多相关文章

  1. 不好的MySQL过程编写习惯

    刚才为了测试一个东西,写了个存储过程: delimiter $$ drop procedure if exists sp_test$$ create procedure sp_test() begin ...

  2. MySQL的SSL加密连接与性能开销

    本文转载自:http://www.innomysql.net/article/23959.html(只作转载, 不代表本站和博主同意文中观点或证实文中信息) Contents [hide] 1 前言 ...

  3. mysql体系结构

    mysql逻辑架构: 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的:连接处理,身份验证,安全性等等. 第二层值得关注.这是MySQL的核 ...

  4. Mysql逻辑模块组成

    总的来说,MySQL可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query c ...

  5. ch2 MySQL 架构组成

    第 2 章 MySQL 架构组成 前言 麻雀虽小,五脏俱全.MySQL    虽然以简单著称,但其内部结构并不简单.本章从 MySQL 物理组成.逻辑组成,以及相关工具几个角度来介绍    MySQL ...

  6. Navicat for MySQL Mac 破解版

    今天在macOS 系统下搭建 Java开发环境,需要配置MySQL,按照Windows的习惯,使用Navicat for MySQL 操作比较习惯.然后找不到比较好的破解版,这里介绍一个老版的,还是英 ...

  7. MySQL架构

    一.MySQL逻辑架构         第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等.         ...

  8. GPL协议的MySQL数据库

    网络上多数朋友担心甲骨文会对MySQL软件采用收费模式,多数朋友也不清楚MySQL开源到底是什么模式,开源=免费嘛?是很多的疑问?MySQL是遵守双重协议的,一个是GPL授权协议,一个是商用授权协议( ...

  9. mysql 概念和逻辑架构

    1.MySQL整体逻辑架构 mysql 数据库的逻辑架构如下图: 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安 ...

随机推荐

  1. XSS跨站脚本攻击学习笔记(pikachu)

    颓废了几天,该好好努力了. XSS概述 XSS漏洞是web漏洞中危害较大的漏洞,是一种发生在web前端的漏洞,所以危害的对象也主要是前端用户,XSS可以用来进行钓鱼攻击,前端js挖矿,获取用户cook ...

  2. [QT] QProcess finished 信号,关联的 slot 必须检查返回码

    void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)

  3. java关于throw Exception的一个小秘密

    目录 简介 throw小诀窍 总结 java关于throw Exception的一个小秘密 简介 之前的文章我们讲到,在stream中处理异常,需要将checked exception转换为unche ...

  4. Spring Boot 之Spring data JPA简介

    文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...

  5. Spring5参考指南:JSR 330标准注解

    文章目录 @Inject 和 @Named @Named 和 @ManagedBean 之前的文章我们有讲过,从Spring3.0之后,除了Spring自带的注解,我们也可以使用JSR330的标准注解 ...

  6. Leetcode PHP题解--D75 706. Design HashMap

    2019独角兽企业重金招聘Python工程师标准>>> D75 706. Design HashMap 题目链接 706. Design HashMap 题目分析 自行设计一个has ...

  7. PPT模板素材

    http://588ku.com/sucai/0-dnum-0-54-0-1/

  8. Node Mysql事务处理封装

    node回调函数的方式使得数据库事务貌似并没有像java.php那样编写简单,网上找了一些事务处理的封装并没有达到自己预期的那样简单编写,还是自己封装一个吧.封装的大体思路很简单:函数接受一个事务处理 ...

  9. python(while 循环语句)

    一.循环语句 1.while 循环 当我们在 python 中需要重复执行一些动作的时候,这时我们就要用到循环 while 循环的结构,当条件成立的时候,就会执行里面的代码 while 循环不断的运行 ...

  10. Jenkins 节点配置

    1.配置代理 系统管理---configure Global Security(全局安全设置)---Tcp port for inbound agents---指定端口 服务器防火墙中开放此端口(li ...