MySql表、约束、视图
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表、约束、视图的更多相关文章
- MySQL进阶:约束,多表设计,多表查询,视图,数据库备份与还原
MySQL进阶 知识点梳理 一.约束 1. 外键约束 为什么要有外键约束 例如:一个user表,一个orderlist 如果现在想要直接删除id为1的张三,但是orderlist里还有用户id为1的订 ...
- MYSQL中约束及修改数据表
MYSQL中约束及修改数据表 28:约束约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括: NOT NULL(非空约束) PRIMARY KEY(主键约束) UNI ...
- Mysql表的约束设计和关联关系设计
https://blog.csdn.net/u012750578/article/details/15026677 Mysql表的约束设计和关联关系设计 ======================表 ...
- 删除所有约束、表、视图等SQL脚本
--删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...
- 使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理
使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在. Caused by: java.sql.S ...
- Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束
Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎: MySQL中的数据用各种不同的技术存储在文件( ...
- mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长
一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select name fr ...
- Mysql中的视图
什么是视图 通俗的讲,视图就是一条SELECT语句执行后返回的结果集.所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句执 ...
- MySQL数据库之视图
1 引言 为了简化复杂SQL语句编写,以及提高数据库安全性,MySQL数据库视图特性.视图是一张虚拟表,不在数据库中以储存的数据值形式存在.在开发中,开发者往往只对某些特定数据和所负责的特定任务感兴趣 ...
随机推荐
- 彻底搞明白PHP的中引用的概念
之前我们其实已经有过几篇文章讲过引用方面的问题,这次我们来全面的梳理一下引用在PHP到底是怎么回事,它和C中的指针有什么不同,在使用的时候要注意些什么. 什么是引用? 在 PHP 中引用意味着用不同的 ...
- ci框架驱动器
1.驱动器什么是 驱动器是一种特殊类型的类库,它有一个父类和任意多个子类.子类可以访问父类, 但不能访问兄弟类.在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类. ...
- tornado中通用模版
第一: 1.Pycharm新建python项目(不是django项目),在项目下面直接新建server.py,内容如下: 2.安装tornado, pip install tornado import ...
- django 自定义auth中user登陆认证以及自写认证
第一种: 重写自定义auth中user登陆认证模块, 引入MobelBackend from django.contrib.auth.backends import ModelBackend 重写验证 ...
- HTML 网页开发、CSS 基础语法——十一. CSS常用样式
文字三属性 1.颜色color 2.字体font-family ① 常用字体 常用的中文字体: 宋体 SimSum 微软雅黑 Microsoft YaHei 常用的英文字体: 如果不设置字体属性,不 ...
- 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05
百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- Python isinstance() 函数 Python 内置函数 Python 内置函数
描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关 ...
- vulnhub靶机-Me and My Girlfriend: 1
vulnhub靶机实战 1.靶机地址:https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/ 2.先看描述(要求) 通过这个我们可以知道我们 ...
- Java编程思想 第九章 接口
第九章 接口 抽象类和抽象方法 抽象:从具体事物抽出.概括出它们共同的方面.本质属性与关系等,而将个别的.非本质的方面.属性与关系舍弃,这种思维过程,称为抽象. 这句话概括了抽象的概念,而在Java中 ...
- 题解 [BJOI2019]奥术神杖
题目传送门 题目大意 给出一个残缺的字符串,每个位置都 \(\in[0,9]\).有 \(m\) 中贡献,即 \(s,k\),表示该字符串中没出现一次 \(s\),贡献便乘上 \(k\).最后对贡献求 ...