1、创建表的时候必须指定主键,并且主键建立后最好不要再有数据修改的需求

mysql从5.5版本开始默认使用innodb引擎,innodb表是聚簇索引表,也就是说数据通过主键聚集( 主键下存储该行的数据,索引指向主键值),如下图所示:

正是由于这种解构,如果后续对主键对应的值进行修改,就会导致索引节点的频繁分裂,性能会下降非常厉害。因此推荐开发的同事们使用和业务没有任何关联的自增id来做主键(切记不要使用uuid来做主键),此外也可以考虑使用其他的方式来生产自增的ID,比如使用Twitter的snowflake算法或者zk的DistributedAtomicLong来间接实现。使用自增主键而不是uuid做主键的优点主要有如下几点:

a、占用的数据量更小

b、数据顺序递增,不会导致索引节点的频繁分裂

c、数字类型比字符类型效率更高

正确招式:使用自增id作为主键

2、创建表选择字段的时候,在符合业务需求的情况下尽量小,数据类型尽量简单

数据类型尽量简单很好理解,比如,使用数字类型要比使用字符类型效率更高,因为不涉及到校对规则和字符集。而字段尽量小,说的是在满足业务需求的情况下,尽可能小。这么做的好处是:更小的字段类型占用更少的内存,占用更少的磁盘空间,占用更少的磁盘IO,以及占用更少的带宽。举个例子,如果一个varchar(50)的字段,不管你存储了几个字符,在查询的时候仍然需要申请50 byte的内存

3、创建表的时候显式申明存储引擎

这个没什么说的,使用什么引擎就申明什么引擎,防止被默认。有句话说得好:如果你不选择,那你就被选择,被选择的结果不一定是你自己想要的。命运还是要掌握的自己手里。

正确招式:显式申明ENGINE=xxxx;

4、创建表的时候显式申明字符集

如果不不想被乱码困扰,就老老实实的申明字符集,还是那句话:如果你不选择,那你就被选择,被选择的结果不一定是你自己想要的。命运还是要掌握的自己手里。

正确的招式:显式申明DEFAULT CHARSET=xxxx;

5、创建表的时候对经常要查询的列添加索引或者组合索引

索引直接影响后面的查询性能,尤其是数据量越大的时候,影响越明显。作为一个从事DBA生涯超过5年的DBA,遇到过无数次由于没有添加索引,导致的线上故障,请各位开发和DBA的同事谨记,一定要对经常要查询的列添加索引或者组合索引,防止线上事故的发生。

正确招式:建表的时候就添加对应INDEX

6、创建表的时候对字段和表添加COMMENT

这个主要是方便后续的维护,之前在小公司做DBA的时候,接手数据库时由于没有任何的COMMENT,导致完全不知道对应的表和字段是做什么用的,不得不经常麻烦开发的同事解释。这个小技巧用一个经典的广告词来解释就是:你好,我也好。

正确招式:对列和表都添加COMMENT做详细说明;

7、创建表的时候不要添加drop操作

有的开发同事在创建表之前喜欢添加, DROP TABLE IF EXISTS TABLEXXXX; 然后再来个CREATE  TABLE,建议不要这么干,因为我之前遇到过由此带来的线上故障。将线上正在使用的表drop掉了。建议大家创建表的时候修改为:CREATE TABLE IF NOT EXISTS TABLEXXX .......;

正确招式:CREATE TABLE IF NOT EXISTS TABLEXXX .......;

8、创建表的时候,字段尽量不要为NULL

解决办法就是设置字段为NOT NULL,并设置字段的默认值。字段尽量不要为NULL的原因如下:

a、NULL需要占用额外的空间存储;

b、进行比较的时候会更复杂,还会导致你select (column)的时候不准确

c、含有NULL值的列,会对SQL优化产生影响,尤其是组合索引中

具体NULL会带来的问题大家可以查阅:https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html

正确招式:NOT NULL DEFAULT 'xxxxx';

附上1个机器简单的标准SQL 范例,大家创建表的时候可以参照下面的范例SQL来创建,范例如下:

CREATE DATABASE IF NOT EXISTS `dev_ops_db`;

CREATE TABLE  IF NOT EXISTS `dev_ops_db`.`monitor_table_holiday` (

`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`holiday_date` date NOT NULL default '1999-01-01' COMMENT '节假日日期',

`holiday_name` varchar(36) NOT NULL default '' COMMENT '节假日名称',

PRIMARY KEY (`id`),

KEY `holiday_date` (`holiday_date`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='节假日数据表';

mysql数据库建表的基本规范的更多相关文章

  1. MYSQL数据库建表注意事项

    1.库名.表名.字段名必须使用小写字母,“_”分割. 原因: MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小 ...

  2. mysql数据库建表授权操作

    1.create schema [数据库名称] default character set utf8 collate utf8_general_ci;--创建数据库 采用create schema和c ...

  3. mysql数据库建表分类字段--尽量少用字符串--原因探索

    虽然一直都知道,类型 之类的字段 直接用字符窜会很方便,不过最好还是不要用字符串:但是也不是特别清楚为什么不要用,时间久了 就忍不住用一下字符窜试试,这一试 还挺好用的,吓得我 感觉探究了一下 为什么 ...

  4. MySQL数据库建表命名的坑

    今天建了一张表,表名为--inOut: 然后再使用中发现怎么都是SQL错误: 然后在Navacat上发现 这是一个关键词! 如果非要继续使用,只能这样: 类似的坑还有user等.

  5. mysql数据库建表

    主键的问题: 简单的id递加.不过在实习的时候,因为id递增的问题,导致一个项目最后好像产生了严重的问题.所以递增适合小型项目,对我们的项目来说90%足够可以用的. 一些限制: 一般就非空就行,唯一的 ...

  6. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  7. MySQL数据库分表的3种方法

    原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...

  8. 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

  9. Java项目专栏之数据库建表

    Java项目专栏之数据库建表 数据库建表前期准备 1. 安装mysql:数据库语言,语法和sql server差不太多,如果习惯于sql server可以不用mysql. 2. 安装navicat:可 ...

随机推荐

  1. gitbook 入门教程之实用插件(新增3个插件)

    插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...

  2. CADisplayLink以及定时器的使用

    第一种: 用CADisplayLink可以实现不停重绘. - (CADisplayLink *)link { if (!_link) { // 创建定时器,一秒钟调用rotation方法60次 _li ...

  3. (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

  4. java 非访问修饰符 final 的用法

    final 修饰符,用来修饰类.方法和变量 final修饰的类不能被继承 举例,String类是final类,不可以被继承: final修饰的方法不能被重写 只是不能重写,也就是不能被子类修改,但是可 ...

  5. 我的第一个python web开发框架(25)——定制ORM(一)

    在开始编写ORM模块之前,我们需要先对db_helper进行重构,因为ORM最终生成的sql是需要转给db_helper来执行的,所以拥有一个功能完善.健壮的数据库操作类是非常必要的. 这是项目原db ...

  6. JS第二部分--DOM文档对象模型

    一.DOM的概念 二.DOM可以做什么 三.DOM对象的获取 四.事件的介绍 五.DOM节点标签样式属性的操作 六.DOM节点对象对值的操作 七.DOM节点-标签属性的操作(例如id class sr ...

  7. 【Python 09】汇率兑换2.0-2(分支语句)

    分支语句:根据判断条件选择程序执行路径 1.使用方法 if <条件1>: <语句块1> elif <条件2>: <语句块2> ... else: < ...

  8. ASP.NET基础知识汇总之WebConfig各节点介绍

    web.config虽然一直用,接触最多的也就是节点appSettings和connectionSettings,今天系统的梳理一下,了解一下webconfig各个节点的含义,先简单的浏览一下具体的w ...

  9. idea maven无法热布署exploded

    (原) 有时,你的idea可能会偶尔出现点小问题,特别是在用maven的时候,以前可以用的热布署发现没有了.就像这样: 少了一个选项,并且下面会有一个提示,no artifacts configure ...

  10. 使用opencv进行简单的手势检测[by Python]

    代码参考于:https://github.com/rainyear/lolita/issues/8 简单的手势识别,基本思路是基于皮肤检测,皮肤的颜色在HSV颜色空间下与周围环境的区分度更高,从RGB ...