MySql表、约束、视图

索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表成为索引组织表(index organized table)。

每张表都有主键,如果创建表的时候没设置主键,会采取以下方式:

1.     是否有非空唯一索引,如果有,选为主键

2.     如果没有非空唯一索引,则InnoDB存储引擎自动创建一个6字节的指针

在1的情况下主键的选择是根据定义索引的顺序,而不是建表时列的顺序选主键。

Create table student(

stu_id int not null,

stu_mobile varchar(11) null,

stu_no varchar(20) not null,

stu_cert_id varchar(18) not null

unique key (stu_mobile),

unique key (stu_cert_id),

unique key (stu_no)

主键会是stu_cert_id,而不是stu_mobile和stu_no

如果主键是但字段,可以通过select _rowid from table,查询主键;

如果主键是联合主键,则_rowid失效。

InnoDB逻辑存储结构

所有数据都被逻辑的存放在表空间中。

表空间由segment(段)、extend(区)、page(页)组成。

如果innodb_file_per_table未设置为ON,则所有表共享一个表空间ibdata1;如果设置为ON,则每张表维护一个表空间,但共享表空间中依然会存放各个表的一些数据。

区是由连续页组成的空间,大小为1MB。

默认情况下页的大小是16KB,即一个区中有64个页。但是新版本的InnoDB,支持通过设置KEY_BLOCK_SIZE来改变每个页的大小为2KB、4KB、8KB(有时候也会称页为块block);或者设置innodb_page_size设置页为4KB、8KB。区别是前者KEY_BLOCK_SIZE引入压缩页,后者不压缩。

页是InnoDB磁盘管理的最小单位。

每个页最多存放16KB/2-200行记录,即7992行记录。

InnoDB行记录格式

InnoDB存储引擎提供了以下几种格式来存放行记录数据

1.     compact

2.     redundant

3.     compressed

4.     dynamic

(一)  compact行记录格式如下:

变长字段长度列表

NULL标志位

记录头信息

列1数据

列2数据

事务ID列

回滚指针列

Rowid

min1字节

max2字节

1字节

5字节

隐藏列

6字节

隐藏列

7字节

未设置主键

6字节

(1)   变长字段长度列表:按照列的顺序的逆序放置。

(2)   NULL标志位:如果该行中有字段为null值,则用1表示

(3)   列数据后还有两列隐藏列,分别是事务ID和回滚指针列,分别是6字节和7字节

(4)   如果没有设置主键,每行还会增加一个6字节的rowid列

(二)  Redundant行记录格式

为了兼容老的版本的页格式。略。

(三)  Compressed和Dynamic行记录格式

这两种格式对于存放blob类型的数据,采用了完全的行溢出的方式。而Compact和Redundant两种格式会存放768个前缀字节,其余的存放在blob页类型中。

Compressed行记录格式,采用zlib算法进行压缩,对大字符存储有利。

行溢出数据

InnoDB存储引擎会将一些特别大的字段的值存储在数据页面之外,这就是所谓的行溢出数据。

MySql的varchar类型可以存放65535字节,但是建表的时候定义字段类型varchar(N),N指的是字段长度,这里的N并不是代表N字节,并且N值该表中所有字段长度之和是N。

举例:

如果数据库charset是latin1,建表支持长度约为varchar(65532),即N=65532,会有部分其他的开销。

如果数据库charset是gbk,建表支持长度约为varchar(32766) ,即N=32766

如果数据库charset是utf-8,建表支持长度约为varchar(21844) ,即N=21844

InnoDB存储引擎的页默认大小为16KB,即16384字节,怎么存放65535字节呢?数据都存放在页类型为B-tree Node中,当时当发生行溢出时,数据会存放在页类型为Uncompress BLOB页中。

如果定义表只有一个字段,且长度是65532如下:

Create table show_innoDB_feature1(

a varchar(65532)

)engine=InnoDB charset=latin1

通过工具分析,得知存储的行逻辑结构如下:

……

Prefix 768bytes

偏移量

……

偏移量指向blob page

InnoDB存储引擎表示索引组织的,即B+Tree的结构,所以每个页中至少应该有两条行记录。

注意以下两点:

varchar类型如果不是特别大,会存在B-tree Node页类型中,如果超过一定长度,则会有部分数据存储在uncompressed blob页类型中;

Blob类型字段如果存字符串不是特别大,也会会存在B-tree Node页类型中,如果超过一定长度,则会有部分数据存储在uncompressed blob页类型中。

Char在多字节字符集下(GBK、UTF-8)跟varchar实际存储是没有区别的。

约束

关系型数据库本身就可以保证数据的完整性。

数据完整性是由约束这一机制来得到保证的。

数据完整性,包含以下三种:

1.      实体完整性

目的:保证表中有一个主键。

手段:通过设置primary key 或者unique key或者编写触发器来实现

2.      域完整性

目的:保证每列的值满足一定的条件

手段:选择合适数据类型、外键约束、触发器、default约束

3.      参照完整性

目的:保证两张表之间的关系

手段:外键、触发器

约束的类型有:

Primary key

Unique key

Foreign key

Default

Not Null

约束和索引的区别:

1.     约束是一个逻辑概念,用来保证数据的完整性

2.     索引是一个数据结构,既有逻辑上的概念,又在数据库中代表着物理存储的方式。

视图

视图是一个命名的虚表,视图中的数据没有实际的物理存储,视图在一定程度上起到一个安全层的作用。

物化视图是把数据存到非易失的存储设备上,但mysql没有物化视图,可以通过建表加上触发器实现物化视图。

分区表

Mysql数据库支持以下几种类型的分区:

1.      Range分区

2.      List分区

3.      Hash分区

4.      Key分区

以上分区限定分区依据字段为整型,如果为非整型,可加关键字columns,例如:

Create … (…)ENGINE=InnoDB

Partition by range cloumns (a)

Partition p0 …

Partition p1 …

Mysql对于Null值的处理:认为null是小于任何非空的字段。(所以排序、分区都会把null放在最小)

MySql表、约束、视图的更多相关文章

  1. MySQL进阶:约束,多表设计,多表查询,视图,数据库备份与还原

    MySQL进阶 知识点梳理 一.约束 1. 外键约束 为什么要有外键约束 例如:一个user表,一个orderlist 如果现在想要直接删除id为1的张三,但是orderlist里还有用户id为1的订 ...

  2. MYSQL中约束及修改数据表

    MYSQL中约束及修改数据表 28:约束约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括:    NOT NULL(非空约束)    PRIMARY KEY(主键约束)    UNI ...

  3. Mysql表的约束设计和关联关系设计

    https://blog.csdn.net/u012750578/article/details/15026677 Mysql表的约束设计和关联关系设计 ======================表 ...

  4. 删除所有约束、表、视图等SQL脚本

    --删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...

  5. 使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理

    使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在. Caused by: java.sql.S ...

  6. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  7. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  8. Mysql中的视图

    什么是视图 通俗的讲,视图就是一条SELECT语句执行后返回的结果集.所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句执 ...

  9. MySQL数据库之视图

    1 引言 为了简化复杂SQL语句编写,以及提高数据库安全性,MySQL数据库视图特性.视图是一张虚拟表,不在数据库中以储存的数据值形式存在.在开发中,开发者往往只对某些特定数据和所负责的特定任务感兴趣 ...

随机推荐

  1. Java跨平台原理(字节码文件,虚拟机)

    介绍 C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机 ...

  2. 【PHP数据结构】PHP数据结构及算法总结

    断断续续地把这个系列写完了,就像上一个设计模式一样,算法这个系列也是前前后后写了将近有一年的时间.当然,都是在业余或者晚上的时间写完的,所以进度如此地慢.更主要的是,既然要写,总得要自己先弄懂吧,对于 ...

  3. deecms栏目页调用自定义字段方法

    {dede:arclist addfields='suoxu_jifen,shichang_jiage' typeid='13' row='15' channelid='3'} <li>& ...

  4. Java基础系列(29)- 方法的重载

    方法的重载 重载就是在一个类中,有相同的函数名称,但形参不同的函数 方法重载的规则: 方法名称必须相同 参数列表必须不同(个数不同.或类型不同.参数排列顺序不同等) 方法的返回类型可以相同也可以不相同 ...

  5. 《使用Jmeter进行批量发送http请求》

    本文主要针对批量接口发送数据 一:接口测试的环境准备 1:JDK的安装:网上下载即可>1.6.0版本以上 2:jemeter工具的下载 (免安装):网上下载即可 3:插件的下载安装地址:http ...

  6. Windows系统中的SVN使用方法

    Windows 下搭建 SVN(3.9版本)服务器 2018年08月11日 12:22:55 Amarao 阅读数 11984   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议, ...

  7. 关于Python中的深浅拷贝

    之前一直认为浅拷贝是拷贝内容的第一层,但是不开辟内存,只是增加新的指向原来的内容:深拷贝是拷贝是拷贝每一层并开辟内存. 其实这个是不严谨的不正确的. 从以上可以看出,浅拷贝中当时可变类型的时候,内存是 ...

  8. 一篇文章告诉你Python接口自动化测试中读取Text,Excel,Yaml文件的方法

    前言 不管是做Ui自动化和接口自动,代码和数据要分离,会用到Text,Excel,Yaml.今天讲讲如何读取文件数据 Python也可以读取ini文件,传送门 记住一点:测试的数据是不能写死在代码里面 ...

  9. 基于PaddleOCR实现AI发票识别的Asp.net Core应用

    简要介绍 用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型. PaddleOCR PaddleOCR ...

  10. windwos10安装mysql8.0.20详细图文教程

    windwos10安装mysql8.0.20详细图文教程 1.浏览器搜索mysql下载安装 地址:https://dev.mysql.com/downloads/mysql/ 2.登录或者不登录下载 ...