到底怎样才能创建一张规范的MySQL表?

为什么必定需要有无业务意义的主键,并且还需要自增?

应该在哪些字段添加索引?

或许有些人会有以上类似的疑问.这几天通过本身的整理加上好友的指导,整理了一份稍微规范一点的建表语句.

如下:规范表示例

MySQL 5.5

CREATE TABLE student_info (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',

`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班级',

`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '学号',

`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '总分',

`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '学费',

`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '电话号码',

`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',

`update_time` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '记录更新时间',

`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',

PRIMARY KEY (`id`),

UNIQUE KEY uniq_stu_num (`stu_num`),

KEY idx_stu_score (`stu_score`),

KEY idx_update_time_tuition (`update_time`, `tuition`)

) ENGINE = INNODB charset = utf8mb4 COMMENT '学生信息表';

MySQL 5.6及以上版本

CREATE TABLE student_info (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',

`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班级',

`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '学号',

`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '总分',

`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '学费',

`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '电话号码',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',

`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',

PRIMARY KEY (`id`),

UNIQUE KEY uniq_stu_num (`stu_num`),

KEY idx_stu_score (`stu_score`),

KEY idx_update_time_tuition (`update_time`, `tuition`)

) ENGINE = INNODB charset = utf8mb4 COMMENT '学生信息表';解释

1、表的命名:使用有意义的英文词汇,词汇中间以下划线分割,全部采用小写;如示例表表名student_info

2、表必需有无符号int型自增主键,对应示例表中id字段.

必需得有主键的原因:

采用RBR模式复制,无主键的表删除,会导致备库夯住

使用自增的原因:

数据写入可以提高插入性能,避免page分裂,减少表碎片.

3、必需把字段定义为NOT NULL并且提供默认值

原因:

a.null的列使索引、统计都更加复杂,使优化更加困难

b.NULL并不是空值,也会占用空间,所以在MySQL进行比拟时,NULL会参与字段比拟,所以对效率有一部分影响

4、所有表、字段都应该有 comment ,来描述表、字段所代表的含义,便利同事查看.

5、能用SMALLINT或者tinyint的情况就不用int,如字段 stu_score就使用的是SMALLINT

原因:使用SMALLINT或者tinyint能节约存储空间

6、涉及到钱的字段建议使用DECIMAL,如示例表字段tuition

7、电话号码建议使用varchar(20),如示例表字段phone_number

原因:

a.涉及到区号或者国家代号,可能出现+-()

b.不会有谁用手机号做运算吧

c.varchar可以支持模糊查询

8、表建议增加create_time和update_time,以记录某条数据的创建时间和修改时间.

注意:这里5.5和5.6有区别,5.5使用的是TIMESTAMP,并且5.5不支持多个CURRENT_TIMESTAMP 默认值,因此如上示例设计;5.6版本使用了datetime,因为datetime支持的范围更广(范围为:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'),并且create_time和update_time两个字段都设置了CURRENT_TIMESTAMP(从5.6.5开始支持多个字段默认值设置为CURRENT_TIMESTAMP)

原因:增加这两个字段便利统计和归档.

9、表建议包括一个状态标记字段,来标识数据是否被删除,而不使用物理删除;比如示例表字段status.

10、不建议使用ENUM,使用TINYINT来代替;如示例表字段status使用的是TINYINT类型.

原因:增加新的ENUM值要做DDL操作

11、使用唯一索引约束字段值唯一的数据,唯一索引以uniq_字段名方式命名;如示例表中的uniq_stu_num

12、在经常作为查询条件的字段上添加索引,普通索引以idx_字段名方式命名;如示例表中的idx_stu_score

13、经常同时出现在where条件中的几个字段可以放在联合索引中;如idx_update_time_tuition;必要注意的是应该把选择性更大的列放在联合索引的最左边.

14、尽量不使用TEXT、BLOB类型

原因:会浪费更多的磁盘和内存空间,非需要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能

15、建议使用innodb存储引擎

原因:innodb支持事务,是行级锁,并发性能更好、CPU及内存缓存页优化使得资源利用率更高.

16、建议使用utf8mb4字符集

原因:万国码,无乱码风险;与utf8编码相比,能支持Emoji脸色.

如何创建一张表mysql_如何创建一张规范的MySQL表相关推荐

  1. php mysql 到表最后_如何在PHP中获取MySQL表的最后插入ID?

    如何在PHP中获取MySQL表的最后插入ID? 我有一张表,经常插入新数据. 我需要获取表格的最后一个ID. 我怎样才能做到这一点? 它类似于SELECT MAX(id) FROM table吗? g ...

  2. plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小

    作者:Peter Zaitsev 翻译:管长龙 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎.不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单 ...

  3. mysql表analyze,ANALYZE TABLE语句如何帮助维护MySQL表?

    MySQL查询优化器是MySQL服务器的重要组成部分,可为查询设置最佳的问题执行.对于特定查询,查询优化器使用存储的键分布和其他因素来确定执行联接时应联接表的顺序以及特定表应使用哪个索引. 但是,键分 ...

  4. mysql 污表_Time Machine 华丽营救被污的 MySQL 表

    之前换新 Mac 时,Time Machine 来做的 OS X 数据迁移,立了大功.最近又立一小功. 作为一名程序员,我写了不少自己日常用的小工具,其中一些以 Web 形式搭建在自己的 Mac 上. ...

  5. mysql创建表时表明加单引号_python在MySQL表名周围插入单引号(‘)

    我有一个名为project1的数据库,其中包含以下表格: _systbl1 _systbl2 _systbl3 dataset1 dataset2 dataset3 每当添加一个新用户时,都需要授予M ...

  6. mysql表中插中文报错_向mysql表中插入含有中文的数据时报错:[Err] 1366

    创建的表及插入语句如下: create table students (name varchar(25), class varchar(25), grade int); insert into stu ...

  7. mysql 表名 下划线_我们可以在MySQL表名中加下划线吗?

    您不能在表名称中添加下划线.如果您仍想使用下划线创建新表,请使用反引号(而不是单引号)将其引起来. 但是,让我们首先尝试在带下划线的表名周围设置引号.以下是一个例子-mysql> create  ...

  8. mysql 添加分区_创建,增加,删除mysql表分区

    1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles ( emp_no      INT NOT NULL, title        ...

  9. 关于MySQL表添加某一列和删除某一列

    前言:MySQL是一种广泛使用的关系型数据库管理系统,它是一种开源的软件,由瑞典的MySQL AB公司开发的. 文章目录: 添加MySQL表中某一列 删除MySQL表中某一列 一.添加MySQL表中某 ...

最新文章

  1. 2017软件工程实践第二次作业(数独)
  2. pdf.js 使用实例
  3. 不改表结构如何动态扩展字段
  4. Hadoop入门(一)概念与单机安装
  5. [html] HTML5的触屏事件有哪些?
  6. 用 普通 用户欺骗登陆 获取 管理员的最高权限~~~~
  7. android 无限循环 简书,Android Handler 解决循环引用
  8. 《统计学习方法》—— 感知机原理、推导以及python3代码实现(一)
  9. oracle转mysql总结,原理+实战+视频+源码
  10. android 查看系统字体大小,Android 如何获取系统字体大小
  11. 文电通PDF编辑转换器[DocuCom PDF Gold] 9.1R2下载和破解补丁
  12. [多媒体] 10大开源视频剪辑软件
  13. CREATE DATABASE 或 ALTER DATABASE 失败,因为结果数据库的累计大小将超出每 数据库 为 4096 MB 的
  14. 吾爱破解新手教程(1)- 破解,逆向,安全
  15. 应届生面试技巧心得及选择工作走向的分析
  16. 公司网盘间的风云变幻PK赛
  17. ADB模拟点击、滑动事件
  18. Luckysheet导出excel
  19. Deploy k8s(1.25)
  20. Eclipse下的Setting property 'source' to '...' did not find a matching property 错误

热门文章

  1. 二分搜索 POJ 3273 Monthly Expense
  2. Android下 scrollview的滚动停止事件的监听方法
  3. 利用Cobbler批量布署CentOS
  4. parted命令详解
  5. treeview托拽和动态添加节点以及treeview和xml的交互的实现
  6. 部署安全的香港服务器注意事项
  7. 双绞线、同轴电缆和光纤电缆的区别
  8. webpack 热替换和热重载
  9. 终于写了自己第一个有些用处的代码,留念留念,是模糊搜索并复制到指定文件夹...
  10. Android 获取 AudioRecord 麦克风音量大小并做选择性发送