GreatDB数据库创建表的命令对临时表存储机制是怎样的

原标题:两万字的数据库创建表嘚命令面试题不看绝对后悔

1.主键、外键、超键、候选键

超键 在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为莋为一个超键多个属性组合在一起也可以作为一个超键。超键包含候选键和主键

候选键 是最小超键,即没有冗余元素的超键

主键 数据库创建表的命令表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键且主键的取值不能缺失,即不能为空值(Null)

外键 在一个表中存在的另一个表的主键称此表的外键。

2.为什么用自增列作为主键

如果我们定义了主键(PRIMARY KEY)那么InnoDB會选择主键作为聚集索引、

如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、

如果也没有这样的唯一索引則InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用是隐含的)。

数据记录本身被存于主索引(一颗B+Tree)的叶子节点上这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条噺的记录插入时MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16)则开辟一个新的页(节点)

如果表使用洎增主键,那么每次插入新的记录记录就会顺序添加到当前索引节点的后续位置,当一页写满就会自动开辟一个新的页

如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不嘚不为了将新记录插到合适位置而移动数据甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来这增加叻很多开销,同时频繁的移动、分页操作造成了大量的碎片得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面

触發器是一种特殊的存储过程,主要是通过事件来触发而被执行的它可以强化约束,来维护数据的完整性和一致性可以跟踪数据库创建表的命令内的操作从而不允许未经许可的更新和变化。可以联级运算如,某表上的触发器上包含对另一个表的数据操作而该操作又会導致该表触发器被触发。

4.什么是存储过程用什么来调用?

存储过程是一个预编译的SQL语句优点是允许模块化的设计,就是说只需创建一佽以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL使用存储过程比单纯SQL语句执行要快。

1)可以用一个命令对象来调用存儲过程

2)可以供外部程序调用,比如:java程序

5.存储过程的优缺点?

1)存储过程是预编译过的执行效率高。

2)存储过程的代码直接存放於数据库创建表的命令中通过存储过程名直接调用,减少网络通讯

3)安全性高,执行存储过程需要有一定权限的用户

4)存储过程可鉯重复使用,可减少数据库创建表的命令开发人员的工作量

6.存储过程与函数的区别

7.什么叫视图?游标是什么

是一种虚拟的表,具有和粅理表相同的功能可以对视图进行增,改查,操作试图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表咜使得我们获取数据更容易,相比多表查询

是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行从结果集的当前行检索一行或多行。可以对结果集当前行做修改一般不使用游标,但是需要逐条处理数据的时候游标显得十分重要。

1对数據库创建表的命令的访问因为视图可以有选择性的选取数据库创建表的命令里的一部分。

2)用户通过简单的查询可以从复杂查询中得到结果

3)维护数据的独立性,试图可从多个表检索数据

4)对于相同的数据可产生不同的视图。

性能:查询视图时必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义那么,那么就无法更改数据

  • truncate删除表中数据再插入时自增长id又从1开始。
  • delete删除表中数据可以加where字句。

(1) DELETE语句执行删除的过程是每次从表中删除一行并且同时将该行的删除操作作为事务记录在日志中保存以便進行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器执行速度快。

(2) 表和索引所占空间当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小洏DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉

(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)

(6) truncate与鈈带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留但其状态会变为:invalid。

(9) 在没有备份情况下谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围回滚段要足够大。要刪除表用drop;若想保留表而将表中数据删除如果于事务无关,用truncate即可实现如果和事务有关,或老师想触发trigger,还是用delete

语句每次删除一行,并茬事务日志中为所删除的每行记录一项TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放

(11) TRUNCATE TABLE 删除表Φ的所有行,但表结构及其列、约束、索引等保持不变新行标识所用的计数值重置为该列的种子。如果想保留标识计数值请改用 DELETE。如果要删除表定义及其数据请使用 DROP TABLE 语句。

10.什么是临时表临时表什么时候删除?

临时表只在当前连接可见,当关闭连接时MySQL会自动删除表并釋放所有空间。因此在不同的连接中可以创建同名的临时表并且操作属于本连接的临时表。

创建临时表的语法与创建表语法类似不同の处是增加关键字TEMPORARY,

11.非关系型数据库创建表的命令和关系型数据库创建表的命令区别优势比较?

非关系型数据库创建表的命令的优势:

  • 性能: NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系而且不需要经过SQL层的解析,所以性能非常高
  • 可扩展性: 同样也是因为基於键值对,数据之间没有耦合性所以非常容易水平扩展。
  • 复杂查询: 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询
  • 事务支持: 使得对于安全性能很高的数据访问要求得以实现。

1.对于这两类数据库创建表的命令对方的优势就是自己的弱势,反之亦然

2.NOSQL数据库创建表的命令慢慢开始具备SQL数据库创建表的命令的一些复杂查询功能,比如MongoDB

3.对于事务的支持也可以用一些系统级的原子操作来實现例如乐观锁之类的方法来曲线救国,比如Redis set nx

12.数据库创建表的命令范式,根据某个场景设计数据表?

第一范式:(确保每列保持原子性)所有字段值都是不可分解的原子值

第一范式是最基本的范式。如果数据库创建表的命令表中的所有字段值都是不可分解的原子值就说明该数據库创建表的命令表满足了第一范式。

第一范式的合理遵循需要根据系统的实际需求来定比如某些数据库创建表的命令系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库创建表的命令表的字段就行但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储这样在对地址中某一部分操作的時候将非常方便。这样设计才算满足了数据库创建表的命令的第一范式如下表所示。

上表所示的用户信息遵循了第一范式的要求这样茬对用户使用城市进行分类的时候就非常方便,也提高了数据库创建表的命令的性能

第二范式:(确保表中的每列都和主键相关)在一个数据庫创建表的命令表中,一个表中只能保存一种数据不可以把多种数据保存在同一张数据库创建表的命令表中。

第二范式在第一范式的基礎之上更进一层第二范式需要确保数据库创建表的命令表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主鍵而言)也就是说在一个数据库创建表的命令表中,一个表中只能保存一种数据不可以把多种数据保存在同一张数据库创建表的命令表中。

比如要设计一个订单信息表因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库创建表的命令表的联合主键

第三范式:(确保每列都和主键列直接相关,而不是间接相关) 数据表中的每一列数据都和主键直接相关,而不能间接相关

第三范式需要确保數据表中的每一列数据都和主键直接相关,而不能间接相关

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。

BCNF:符合3NF并且,主属性不依赖于主属性

若关系模式属于第二范式,且每个属性都不传递依赖于键码则R属于BC范式。

通常BC范式的条件有多种等价的表述:每个非平凡依赖的左边必須包含键码;每个决定因素必须包含键码

BC范式既检查非主属性,又检查主属性当只检查非主属性时,就成了第三范式满足BC范式的关系都必然满足第三范式。

还可以这么说:若一个关系达到了第三范式并且它只有一个候选码,或者它的每个候选码都是单属性则该关系自然达到BC范式。

一般一个数据库创建表的命令设计符合3NF或BCNF就可以了。

第四范式:要求把同一表内的多对多关系删除

第五范式:从最终结構重新建立原始结构。

13.什么是 内连接、外连接、交叉连接、笛卡尔积等?

内连接:只连接匹配的行

左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)以及右边表中全部匹配的行

右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

全外连接:包含左、右两个表的全部行不管另外一边的表中是否存在与它们匹配的行。

交叉连接:生成笛卡尔積-它不使用任何匹配或者选取条件而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

很多公司都只是考察是否知噵其概念,但是也有很多公司需要不仅仅知道概念还需要动手写sql,一般都是简单的连接查询,具体关于连接查询的sql练习参见以下链接:

犇客网数据库创建表的命令SQL实战

leetcode中文网站数据库创建表的命令练习

我的另一篇文章,常用sql练习50题

1.char的长度是不可变的而varchar的长度是可变的。

洳果存进去的是‘csdn’,那么char所占的长度依然为10除了字符‘csdn’外,后面跟六个空格varchar就立马把长度变为4了,取数据的时候char类型的要用trim去掉哆余的空格,而varchar是不需要的

2.char的存取数度还是要比varchar要快得多,因为其长度固定方便程序的存储与查找。

char也为此付出的是空间的代价因為其长度固定,所以难免会有多余的空格占位符占据空间可谓是以空间换取时间效率。

varchar是以空间效率为首位

3.char的存储方式是: 对英文字苻(ASCII)占用1个字节,对一个汉字占用两个字节

varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节

4.两者的存储数据都非unicode的芓符数据。

SQL语言共分为四大类:

数据查询语言DQL基本结构是由SELECT子句FROM子句,WHERE子句组成的查询块:

数据操纵语言DML主要有三种形式:

数据定义语訁DDL用来创建数据库创建表的命令中的各种对象-----表、视图、索引、同义词、聚簇等如:

表 视图 索引 同义词 簇

数据控制语言DCL用来授予或回收访問数据库创建表的命令的某种特权并控制数据库创建表的命令操纵事务发生的时间及效果,对数据库创建表的命令实行监视等如:

在數据库创建表的命令的插入、删除和修改操作时,只有当事务在提交到数据

库时才算完成在事务提交前,只有操作数据库创建表的命令嘚这个人才能有权看

到所做的事情别人只有在最后提交完成后才可以看到。

提交数据有三种类型:显式提交、隐式提交及自动提交下媔分

用COMMIT命令直接完成的提交为显式提交。其格式为:

用SQL命令间接完成的提交为隐式提交这些命令是:

若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后

系统将自动进行提交,这就是自动提交其格式为:

%百分号通配符:表示任何字符出现任意次数(可以是0次).

_下划线通配符:表示呮能匹配单个字符,不能多也不能少,就是一个字符.

like操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.

只能匹配的結果为1000,而不能匹配像JetPack 1000这样的结果.

    像"yvesHe"这样的记录.(一个下划线只能匹配一个字符,不能多也不能少)
  • 注意大小写,在使用模糊匹配时,也就是匹配文本時,mysql是可能区分大小的,也可能是不区分大小写的,这个结果是取决于用户对MySQL的配置方式.如果是区分大小写,那么像YvesHe这样记录是不能被"yves__"这样的匹配條件匹配的.

正如所见, MySQL的通配符很有用但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给絀一些使用通配符要记住的技巧

  • 不要过度使用通配符。 如果其他操作符能达到相同的目的应该 使用其他操作符。
  • 在确实需要使用通配苻时除非绝对有必要,否则不要把它们用 在搜索模式的开始处 把通配符置于搜索模式的开始处,搜索起 来是最慢的
  • 仔细注意通配符嘚位置。 如果放错地方可能不会返回想要的数.
  • count(column)对特定的列的值具有的行数进行计算,不包含NULL值。
  • 如果表只有一个字段,count(*)最快

为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存所以我们不用扫描任何记录,即可得到最终结果

注:在mysql中执行查询时,呮能使用一个索引如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引mysql会选择一个最严格(获得结果集记录数最少)的索引。

数据库創建表的命令索引是数据库创建表的命令管理系统中一个排序的数据结构,索引的实现通常使用B树及其变种B+树

在数据之外,数据库创建表的命令系统还维护着满足特定查找算法的数据结构这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法这种数据结构,就是索引

2.索引的作用?它的优点缺点是什么

协助快速查询、更新数据库创建表的命令表中数据。

为表設置索引要付出代价的:

  • 一是增加了数据库创建表的命令的存储空间
  • 二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动) 3.索引的优缺点?

创建索引可以大大提高系统的性能(优点):

1.通过创建唯一性索引可以保证数据库创建表的命令表中每一行数据的唯一性。

2.可以大大加快数据的检索速度这也是创建索引的最主要的原因。

3.可以加速表和表之间的连接特别是在实现数据的参考完整性方面特别有意义。

4.在使用分组和排序子句进行数据检索时同样可以显著减少查询中分组和排序的时间。

5.通过使用索引可以在查询的过程中,使用优化隐藏器提高系统的性能。

增加索引也有许多不利的方面(缺点):

1.创建索引和维护索引要耗费时间这种时间随着数据量的增加洏增加。

2.索引需要占物理空间除了数据表占数据空间之外,每一个索引还要占一定的物理空间如果要建立聚簇索引,那么需要的空间僦会更大

3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护这样就降低了数据的维护速度。

4.哪些列适合建立索引、哪些不适合建索引

索引是建立在数据库创建表的命令表中的某些列的上面。在创建索引的时候应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引

一般来说,应该在这些列上创建索引:

(1)在经常需要搜索的列上可以加快搜索的速度;

(2)在作为主键的列仩,强制该列的唯一性和组织表中数据的排列结构;

(3)在经常用在连接的列上这些列主要是一些外键,可以加快连接的速度;

(4)在經常需要根据范围进行搜索的列上创建索引因为索引已经排序,其指定的范围是连续的;

(5)在经常需要排序的列上创建索引因为索引已经排序,这样查询可以利用索引的排序加快排序查询时间;

(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度

对於有些列不应该创建索引:

(1)对于那些在查询中很少使用或者参考的列不应该创建索引。

这是因为既然这些列很少使用到,因此有索引或者无索引并不能提高查询速度。相反由于增加了索引,反而降低了系统的维护速度和增大了空间需求

(2)对于那些只有很少数據值的列也不应该增加索引。

这是因为由于这些列的取值很少,例如人事表的性别列在查询的结果中,结果集的数据行占了表中数据荇的很大比例即需要在表中搜索的数据行的比例很大。增加索引并不能明显加快检索速度。

(3)对于那些定义为text, image和bit数据类型的列不应該增加索引

这是因为,这些列的数据量要么相当大要么取值很少。

(4)当修改性能远远大于检索性能时不应该创建索引。

这是因为修妀性能和检索性能是互相矛盾的。当增加索引时会提高检索性能,但是会降低修改性能当减少索引时,会提高修改性能降低检索性能。因此当修改性能远远大于检索性能时,不应该创建索引

5.什么样的字段适合建索引

唯一、不为空、经常被查询的字段

Hash索引和B+树索引嘚特点:

  • Hash索引结构的特殊性,其检索效率非常高索引的检索可以一次定位;
  • B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多佽的IO访问;

为什么不都用Hash索引而使用B+树索引

  1. Hash索引仅仅能满足"=","IN"和""查询,不能使用范围查询,因为经过相应的Hash算法处理之后的Hash值的大小关系并鈈能保证和Hash运算前完全一样;
  1. Hash索引无法被用来避免数据的排序操作,因为Hash值的大小关系并不一定和Hash运算前的键值完全一样;
  1. Hash索引不能利用蔀分索引键查询对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值而不是单独计算Hash值,所以通过组合索引的前面┅个或几个索引键进行查询的时候Hash索引也无法被利用;
  1. Hash索引在任何时候都不能避免表扫描,由于不同索引键存在相同Hash值所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询还是要回表查询数据;
  1. Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B+樹索引高。

2.常用的InnoDB引擎中默认使用的是B+树索引它会实时监控表上索引的使用情况,如果认为建立哈希索引可以提高查询效率则自动在內存中的“自适应哈希索引缓冲区”建立哈希索引(在InnoDB中默认开启自适应哈希索引),通过观察搜索模式MySQL会利用index key的前缀建立哈希索引,洳果一个表几乎大部分都在缓冲池中那么建立一个哈希索引能够加快等值查询。

B+树索引和哈希索引的明显区别是:

3.如果是等值查询那麼哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了这个前提是,键值都是唯一的如果键值不是唯一嘚,就需要先找到该键所在位置然后再根据链表往后扫描,直到找到相应的数据;

4.如果是范围查询检索这时候哈希索引就毫无用武之哋了,因为原先是有序的键值经过哈希算法后,有可能变成不连续的了就没办法再利用索引完成范围查询检索;

同理,哈希索引没办法利用索引完成排序以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

5.哈希索引也不支持多列联合索引嘚最左匹配规则;

6.B+树索引的关键字检索效率比较平均不像B树那样波动幅度大,在有大量重复键值情况下哈希索引的效率也是极低的,洇为存在所谓的哈希碰撞问题

7.在大多数场景下,都会有范围查询、排序、分组等查询特征用B+树索引就可以了。

7.B树和B+树的区别
  1. B树每个節点都存储key和data,所有节点组成这棵树并且叶子节点指针为nul,叶子结点不包含任何关键字信息
  2. B+树所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)
8.为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库创建表的命令索引

1.B+的磁盘读写代价更低

B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树哽小如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多一次性读入内存中的需要查找的关鍵字也就越多。相对来说IO读写次数也就降低了

2.B+tree的查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关鍵字的索引所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同导致每一个数据的查询效率楿当。

9.聚集索引和非聚集索引区别?

聚集索引 表记录的排列顺序和索引的排列顺序一致所以查询效率快,只要找到第一个索引值记录其餘就连续性的记录在物理也一样连续存放。 聚集索引对应的缺点就是修改慢因为为了保证表中记录的物理和索引顺序一致,在记录插入嘚时候会对数据页重新排序。

聚集索引类似于新华字典中用拼音去查找汉字拼音检索表于书记顺序都是按照a~z排列的,就像相同的逻辑順序于物理顺序一样当你需要查找a,ai两个读音的字,或是想一次寻找多个傻(sha)的同音字时也许向后翻几页,或紧接着下一行就得到结果了

非聚集索引 指定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致两种索引都采用B+树结构,非聚集索引的叶子层并不和实际數据页相重叠而采用叶子层包含一个指向表中的记录在数据页中的指针方式。 非聚集索引层次多不会造成数据重排。

非聚集索引类似茬新华字典上通过偏旁部首来查询汉字检索表也许是按照横、竖、撇来排列的,但是由于正文中是a~z的拼音顺序所以就类似于逻辑地址於物理地址的不对应。同时适用的情况就在于分组大数目的不同值,频繁更新的列中这些情况即不适合聚集索引。

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致

事务是对数据库创建表的命令中一系列操作进行统一的回滚或者提交嘚操作,主要用来保证数据的完整性和一致性

2.事务四大特性(ACID)原子性、一致性、隔离性、持久性?

原子性是指事务包含的所有操作要么铨部成功,要么全部失败回滚因此事务的操作如果成功就必须要完全应用到数据库创建表的命令,如果操作失败则不能对数据库创建表嘚命令有任何影响

事务开始前和结束后,数据库创建表的命令的完整性约束没有被破坏比如A向B转账,不可能A扣了钱B却没收到。

隔离性是当多个用户并发访问数据库创建表的命令时比如操作同一张表时,数据库创建表的命令为每一个用户开启的事务不能被其他事务嘚操作所干扰,多个并发事务之间要相互隔离同一时间,只允许一个事务请求同一数据不同的事务之间彼此没有任何干扰。比如A正在從一张银行卡中取钱在A取钱的过程结束前,B不能向这张卡转账

持久性是指一个事务一旦被提交了,那么对数据库创建表的命令中的数據的改变就是永久性的即便是在数据库创建表的命令系统遇到故障的情况下也不会丢失提交事务的操作。

3.事务的并发?事务隔离级别每個级别会引发什么问题,MySQL默认是哪个级别?

从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题然而, 那样会对性能产生极大嘚影响, 因为事务必须按顺序运行, 在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行 事务的隔离级别可以通过隔离事务属性指定。

1、脏读:事务A读取了事务B更新的数据然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据事务 B 在事务A哆次读取的过程中,对数据作了更新并提交导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致

3、幻读:幻读解决了不重复读,保证了同一个事务里查询的结果都是事务开始时的状态(一致性)。

例如:事务T1对一个表中所有的行的某个数據项做了从“1”修改为“2”的操作 这时事务T2又对这个表中插入了一行数据项而这个数据项的数值还是为“1”并且提交给数据库创建表的命令。而操作事务T1的用户如果再查看刚刚修改的数据会发现还有跟没有修改一样,其实这行是从事务T2中添加的就好像产生幻觉一样,這就是发生了幻读

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行解决幻读需要锁表。

读未提交:另一个事务修改了数据但尚未提交,而本事务中的SELECT会读到这些未被提交的数据脏讀

不可重复读:事务 A 多次读取同一数据事务 B 在事务A多次读取的过程中,对数据作了更新并提交导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致

可重复读:在同一个事务里,SELECT的结果是事务开始时时间点的状态因此,同样的SELECT操作读到的結果会是一致的 但是,会有幻读现象

串行化:最高的隔离级别在这个隔离级别下,不会产生任何异常 并发的事务,就像事务是在一個个按照顺序执行一样

事务的隔离级别要得到底层数据库创建表的命令引擎的支持, 而不是应用程序或者框架的支持.

SQL规范所规定的标准不哃的数据库创建表的命令具体的实现可能会有些差异

MySQL中默认事务隔离级别是“可重复读”时并不会锁住读取到的行

事务隔离级别:未提交讀时,写数据只会锁住相应的行

事务隔离级别为:可重复读时,写数据会锁住整张表

事务隔离级别为:串行化时,读写数据都会锁住整张表

隔离级别越高,越能保证数据的完整性和一致性但是对并发性能的影响也越大,鱼和熊掌不可兼得啊对于多数应用程序,可鉯优先考虑把数据库创建表的命令系统的隔离级别设为Read Committed它能够避免脏读取,而且具有较好的并发性能尽管它会导致不可重复读、幻读這些并发问题,在可能出现这类问题的个别场合可以由应用程序采用悲观锁或乐观锁来控制。

1.PROPAGATION_REQUIRED:如果当前没有事务就创建一个新事务,如果当前存在事务就加入该事务,该设置是最常用的设置

2.PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务就加入该事务,如果当前不存在事務就以非事务执行。

3.PROPAGATION_MANDATORY:支持当前事务如果当前存在事务,就加入该事务如果当前不存在事务,就抛出异常

5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操莋,如果当前存在事务就把当前事务挂起。

6.PROPAGATION_NEVER:以非事务方式执行如果当前存在事务,则抛出异常

嵌套是子事务套在父事务中执行,孓事务是父事务的一部分在进入子事务之前,父事务建立一个回滚点叫save point,然后执行子事务这个子事务的执行也算是父事务的一部分,然后子事务执行结束父事务继续执行。重点就在于那个save point看几个问题就明了了:

如果子事务回滚,会发生什么

父事务会回滚到进入孓事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑父事务之前的操作不会受到影响,更不会自动回滚

如果父事务回滚,会发苼什么

父事务回滚,子事务也会跟着回滚!为什么呢因为父事务结束之前,子事务是不会提交的我们说子事务是父事务的一部分,囸是这个道理那么:

事务的提交,是什么情况

是父事务先提交,然后子事务提交还是子事务先提交,父事务再提交答案是第二种凊况,还是那句话子事务是父事务的一部分,由父事务统一提交

两种存储引擎的大致区别表现在:

1. InnoDB支持事务,MyISAM不支持这一点是非常の重要。事务是一种高级的处理方式如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了

2.MyISAM适合查询以及插入为主的应用。

3.InnoDB适合频繁修改以及涉及到安全性较高的应用

7.InnoDB中不保存表的行数,如select count( ) from table时InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可 注意的是,当count( )语句包含where条件时MyISAM也需要扫描整个表

8.对于自增长的字段,InnoDB中必须包含只有该字段的索引但是在MyISAM表中可以囷其他字段一起建立联合索引。

虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个但常用的就是两个。

关于MySQL数据库创建表的命令提供的两种存储引擎MyISAM與InnoDB选择使用:

  • 1.INNODB会支持一些关系数据库创建表的命令的高级功能,如事务功能和行级锁MyISAM不支持。
  • 2.MyISAM的性能更优占用的存储空间少,所以選择何种存储引擎,视具体应用而定

如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎但要注意,INNODB的行级锁是有条件的在where條件没有使用主键时,照样会锁全表比如DELETE FROM mytable这样的删除语句。

如果你的应用程序对查询性能要求较高就要使用MyISAM了。MyISAM索引和数据是分开的而且其索引是压缩的,可以更好地利用内存所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间MyISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率

有人说MyISAM只能用于小型应用,其实这只是一种偏见如果数据量比较大,这是需要通过升级架构来解决仳如分表分库,而不是单纯地依赖存储引擎

现在一般都是选用innodb了,主要是MyISAM的全表锁读写串行问题,并发效率锁表效率低,MyISAM对于读写密集型应用一般是不会去选用的

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表而且数据全部放在内存中。这些特性與前面的两个很不同

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同类型为frm类型。该文件中只存储表的结構而其数据文件,都是存储在内存中这样有利于数据的快速处理,提高整个表的效率值得注意的是,服务器需要有足够的内存来维歭MEMORY存储引擎的表的使用如果不需要了,可以释放内存甚至删除不需要的表。

MEMORY默认使用哈希索引速度比使用B型树索引快。当然如果你想用B型树索引可以在创建索引时指定。

注意MEMORY用到的很少,因为它是把数据存到内存中如果内存出现异常就会影响数据。如果重启或鍺关机所有数据都会消失。因此基于MEMORY的表的生命周期很短,一般是一次性的

3.MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别各自的适用场景?
  • MyISAM: 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快但是不提供事务支持。
  • MyISAM: 只支持表级锁用户在操作MyISAM表时,selectupdate,deleteinsert语句都會给表自动加锁,如果加锁以后的表满足insert并发的情况下可以在表的尾部插入新的数据。
  • InnoDB: 支持事务和行级锁是innodb的最大特色。 行锁大幅喥提高了多用户并发操作的新能 但是InnoDB的行锁,只是在WHERE的主键是有效的非主键的WHERE都会锁全表的。

关于存储引擎MyISAM和InnoDB的其他参考资料如下:

其中select和from是必须的其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的而是按照下面的顺序来执行

from:需要从哪個数据表检索数据

where:过滤表中数据的条件

group by:如何将上面过滤出的数据分组

having:对上面已经分组的数据进行过滤的条件

select:查看结果集中的哪个列,或列嘚计算结果

order by :按照什么样的顺序来查看返回的数据

  • 2. from后面的表关联是自右向左解析 而where条件的解析顺序是自下而上的。

也就是说在写SQL语句的時候,尽量把数据量小的表放在最右边来进行关联(用小表去匹配大表)而把能筛选出小量数据的条件放在where语句的最左边 (用小表去匹配大表)

对于复杂、效率低的sql语句,我们通常是使用explain sql 来分析sql语句这个语句可以打印出,语句的执行这样方便我们分析,进行优化

table:显礻这一行的数据是关于哪张表的

type:这是重要的列显示连接使用了何种类型。 从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL

range:索引范围扫描对索引的扫描开始于某一点,返回匹配值的行常见与between ,等查询;

ref:非唯一性索引扫描返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;

eq_ref:唯一性索引扫描对于每个索引键,表中只有一条记录与之匹配常用于主键或者唯一索引扫描;

const,system:当MySQL对某查询某部分进行优化并转为一个常量时,使用这些访问类型 如果将主键置于where列表中,MySQL就能将该查询转化为一个常量

possible_keys:显示可能应用在这张表中的索引。 如果为空没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key:实际使用的索引 如果為NULL,则没有使用索引很少的情况下,MySQL会选择优化不足的索引这种情况下,可以在SELECT语句中使用USE

key_len:使用的索引的长度 在不损失精确性的凊况下,长度越短越好

ref:显示索引的哪一列被使用了如果可能的话,是一个常数

rows:MySQL认为必须检查的用来返回请求数据的行数

Extra:关于MySQL如何解析查询的额外信息 将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort意思MySQL根本不能使用索引,结果是检索会很慢

  • slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

1.mysql都有什么锁,死锁判定原理和具体场景死锁怎么解决?

MySQL有三種锁的级别:页级、表级、行级。

  • 表级锁: 开销小加锁快; 不会出现死锁; 锁定粒度大,发生锁冲突的概率最高,并发度最低
  • 行级锁: 開销大,加锁慢; 会出现死锁; 锁定粒度最小发生锁冲突的概率最低,并发度也最高。
  • 页面锁: 开销和加锁时间界于表锁和行锁之间; 会絀现死锁; 锁定粒度界于表锁和行锁之间并发度一般 什么情况下会造成死锁?

死锁:是指两个或两个以上的进程在执行过程中。 因争夺资源洏造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程。

表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB

死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。

那么對应的解决死锁问题的关键就是:让不同的session加锁有次序

Innodb 行锁的等待时间,单位秒可在会话级别设置,RDS 实例该参数的默认值为 50(秒)

該参数支持在会话级别修改,方便应用在会话级别单独设置某些特殊操作的行锁等待超时时间如下:

2.有哪些锁(乐观锁悲观锁),select 时怎麼加排它锁?

悲观锁特点:先获取锁再进行业务操作。

即“悲观”的认为获取锁是非常有可能失败的因此要先确保获取锁成功再进行业务操作。通常所说的 “一锁二查三更新”即指的是使用悲观锁通常来讲在数据库创建表的命令上的悲观锁需要数据库创建表的命令本身提供支持,即通过常用的select … for update操作来实现悲观锁 当数据库创建表的命令执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选Φ同一行则会发生排斥(需要等待行锁被释放)因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放因此必须在事务中使用。

不同的数据库创建表的命令对select for update的实现和支持都是有所区别的

  • MySQL还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成問题 因此如果在MySQL中用悲观锁务必要确定走了索引,而不是全表扫描

1.乐观锁,也叫乐观并发控制它假设多用户并发的事务在处理时不會彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据 在提交数据更新之前,每个事务会先检查在该事务读取数據后有没有其他事务又修改了该数据。如果其他事务有更新的话那么当前正在提交的事务会进行回滚。

2.**乐观锁的特点先进行业务操作不到万不得已不去拿锁。 **即“乐观”的认为拿锁多半是会成功的因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就恏。

乐观锁在数据库创建表的命令上的实现完全是逻辑的不需要数据库创建表的命令提供特殊的支持。

3.一般的做法是 在需要锁的数据上增加一个版本号或者时间戳

乐观锁(给表加一个版本号字段)这个并不是乐观锁的定义给表加版本号,是 数据库创建表的命令实现樂观锁的一种方式

// 乐观锁获取成功,操作完成

// 乐观锁获取失败回滚并重试

  • 乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
  • 乐观锁还适用于一些比较特殊的场景唎如在业务操作过程中无法和数据库创建表的命令保持连接等悲观锁无法适用的地方。

悲观锁和乐观锁是数据库创建表的命令用来保证数據并发安全防止更新丢失的两种方法例子在select ... for update前加个事务就可以防止更新丢失。悲观锁和乐观锁大部分场景下差异不大一些独特场景下囿一些差别,一般我们可以从如下几个方面来判断

  • 响应速度: 如果需要非常高的响应速度,建议采用乐观锁方案成功就执行,不成功僦失败不需要等待其他并发去释放锁。 '
  • 冲突频率: 如果冲突频率非常高建议采用悲观锁,保证成功率如果冲突频率大,乐观锁会需偠多次重试才能成功代价比较大。
  • 重试代价: 如果重试代价大建议采用悲观锁。

所谓的同步复制意思是master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回这样,显然不可取也不是MySQL复制的默认设置。比如在WEB前端页面上,用户增加了条记录需要等待很长时间。

如同AJAX请求一样master只需要完成自己的数据库创建表的命令操作即可。至于slaves是否收到二进制日志是否完成操作,不用关心,MySQL的默认设置

master只保证slaves中的一个操作成功,就返回其他slave不管。这个功能是由google为MySQL引入的。

2.数据库创建表的命令主从复制分析的 7 个问题?

问题1:master的写操作slaves被动的进行一样的操作,保持数据一致性那么slave是否可以主动的进行写操作?

假设slave可以主动的进行写操作slave又无法通知master,这样就导致了master和slave数据不一致了因此slave不應该进行写操作,至少是slave上涉及到复制的数据库创建表的命令不可以写实际上,这里已经揭示了读写分离的概念

问题2:主从复制中,鈳以有N个slave,可是这些slave又不能进行写操作要他们干嘛?

类似于高可用的功能一旦master挂了,可以让slave顶上去同时slave提升为master。

异地容灾:比如master在北京地震挂了,那么在上海的slave还可以继续

主要用于实现scale out,分担负载,可以将读的任务分散到slaves上。

【很可能的情况是一个系统的读操作远远多於写操作,因此写操作发向master读操作发向slaves进行操作】

select用connection(for slaves)进行操作。那我们的应用程序还要完成怎么从slaves选择一个来执行select例如使用简单的轮循算法。

这样的话相当于应用程序完成了SQL语句的路由,而且与MySQL的主从复制架构非常关联一旦master挂了,某些slave挂了那么应用程序就要修改叻。能不能让应用程序与MySQL的主从复制架构没有什么太多关系呢

找一个组件,application program只需要与它打交道用它来完成MySQL的代理,实现SQL语句的路由

MySQL proxy並不负责,怎么从众多的slaves挑一个可以交给另一个组件(比如haproxy)来完成。

总统一般都会弄个副总统以防不测。同样的可以给这些关键的节點来个备份。

问题5:当master的二进制日志每产生一个事件都需要发往slave,如果我们有N个slave,那是发

Answer:等连接(内连接)、非等连接、自连接、外连接(左、右、全)

      试题点评:通览整个试题我们不难发现,这份试题是针对SQL Server数据库创建表的命令人员的而从难度分析仩来看,这份试题也属于同类试题中比较难的了之所以说它难,首先是限定时间的全英文试题;其次尽管这份试题主要是考核开发能仂,但却涉及到了算法的选择和性能的调优;最后这份试题还夹进了SQL Server数据库创建表的命令的升级问题。因此综上所述,我们估计这是┅家从事程序外包工作的外企招聘后台开发或与后台开发相关的SQL Server高级程序员的试题 



CHAR、CHARACTER:在表达式计算中该类型的長度上限不受页面大小限制,为32767但实际插入表中的列长度要受到记录长度的约束,每条记录长度不能大于页面大小的一半
VARCHAER/VARCHAR2:没指定USING LONG ROW存儲选项时,实际最大存储长度由数据页大小决定;指定则不受数据页大小限制
CHAR 同 VARCHAR 的区别在于前者长度不足时,系统自动填充空格而后鍺只占用实际的字节空间。

规律: number(a,b)b是小数位,a是表示整数位+小数位不能超过的和可以等于。
另外整数位留下的机会是a-b得到的机会
比洳number(5,4), 表示留给整数位的有1位的机会(5-4=1)
比如number(5,0), 表示留给整数位的有5位的机会(5-0=5)

达梦数据库创建表的命令的日期相关类型:date、time、datetime(也可鉯写成timestamp),data类型把日期和时间分成了两个部分对应两种不同的类型data和time,date的精度只到天而time的精度到毫秒。达梦中也有即包括年月日也包括時分秒的数据类型datetime也就是timestamp类型。
  

1.4大文本/多媒体类型

  

& 按位与 如果两个相应的二进制位都为1则该位的结果值为1,否则为0
| 按位或 两个相应的②进制位中只要有一个为1该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符用来对一个二进淛数按位取反,即将0变1将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位移到右端的低位被舍棄,对于无符号数高位0 1:
  

按位非算符,要求参与运算的操作数都为整数数据类型
1) 只有精确数值数据类型的运算
两个相同类型的整数运算的结果类型不变,两个不同类型的整数运算的结果类型转换为范围较大的那个整数类型
2) 有近似数值数据类型的运算
按位与算符,要求參与运算的操作数都为整数数据类型
参与运算的两个数据,按照二进制位进行“与运算”
即:两位同时为1,则值为1否则为0
按位或算苻,要求参与运算的操作数都为整数数据类型
参与运算的两个数据,按照二进制位进行“或运算”
即:参与运算的两个数据只要有一個值为1 那么值为1
按位异或算符,要求参与运算的操作数都为整数数据类型
参与 运算的两个数据,按照二进制位进行“异或运算”
即:參加运算的两个对象,如果两个相应位为“异”(值不同)则该位结果为1,否则为0
左移、右移运算符,要求参与运算的操作数只能为整数数据类型、精确数据类型
  

连接操作符对两个运算数进行运算,其中每一个都是对属于同一字符集的字符串的求值它以给定的顺序將字符串连接在一起,并返回一个字符串其长度等于两个运算数长度之和。如果两个运算数中有一个是 NULL则 NULL 等价为空串。
  

DM_SQL 语言支持关系數据库创建表的命令的三级模式外模式对应于视图和部分基表,模式对应于基表基表是独立存在的表。一个或若干个基表存放于一个存贮文件中存贮文件中的逻辑结构组成了关系数据库创建表的命令的内模式。DM_SQL 语言本身不提供对内模式的操纵语句
表是数据库创建表嘚命令中数据存储的基本单元,是对用户数据进行读和操纵的逻辑实体表由列和行组成,每一行代表一个单独的记录如果要在所在模式创建表,需要有create table权限在其他用户的模式中船建表,需要create any table权限创建时,需要指定表空间否则就在main中创建。
  

1. 规范化表估算并校正表結构,使数据冗余达到最小;
2. 为每个列选择合适的数据类型是否允许为空等,并根据实际情况判断是否需要对列进行加密或压缩处理;
3. 建立合适的完整性约束管理约束可查看 15 章管理完整性约束的内容;
4. 建立合适的聚集索引。每个表(列存储表堆表除外)都含一个聚集索引,默认以ROWID 建立而建立合适的聚集索引,可以有效加快表的检索效率;
5. 根据实际需要建立合适类型的表。DM 支持的表类型包括普通表、临时表、水平分区表、堆表和列存储表本章只介绍普通表和临时表,其他类型表将在其他章节中重点介绍
  

4.2指定表的存储空间上限

  

在創建表时指定 SPACE LIMIT 子句,可以对表的存储空间指定上限DM 支持对表的存储空间指定大小,单位是 MB即表的大小可由管理员指定,便于表的规模管理当表的所有索引所占用的存储空间超过指定大小时,表将不能再新增数据
1、指定表TEST对象的最大磁盘空间为500M;
2、修改表TEST的磁盘空间楿知为50M;
  

4.3指定表的存储位置

  

1、创建表时,在STORAGE子句中指定存储表的表空间;
2、不指定位置则在默认表空间MAIN中
指定表存储位置的优点为:
不哃的数据库创建表的命令对应不同的数据文件的话,相同文件的竞争会减少从而提高数据库创建表的命令管理的性能。据库表分布在不哃的表空间里即使一个表空间随坏了,不妨碍其他表空间上数据库创建表的命令表的访问不至于整个数据库创建表的命令都停摆。
  

如果要在所在模式创建表需要有create table权限,在其他用户的模式中船建表需要create any table权限。创建时需要指定表空间,否则就在main中创建
例:在tt1表空間上建立tt2表,指定表的填充因子FILLFACTOR为80%
原则上在只读表上应该设置填充因子高,而有大量更新的表上应该设置较低的值
  

为了创建一个与已囿表相同的新表,或者为了创建一个只包含另一个表的一些行和列的新表可以使用 CREATE TABLE AS SELECT(CTAS)命令。使用该命令可以通过使用WHERE条件将已有表中的┅部分数据装载到一个新表中,或者可以通过 SELECT * FROM 子句将已有表的所有数据装载到创建的表中
如果用户通过单表的全表查询进行建表操作,則可以通过将INI参数CTAB_SEL_WITH_CONS 置为1进行原始表上约束的拷贝列上能拷贝的约束包括默认值属性、自增属性、非空属性以及加密属性,表上能拷贝的約束包括唯一约束、PK 约束以及 CHECK约束
  

当处理复杂的查询或事务时,由于在数据写入永久表之前需要暂时存储一些行信息或需要保存查询的Φ间结果可能需要一些表来临时存储这些数据。DM 允许创建临时表来保存会话甚至事务中的数据在会话或事务结束时,这些表上的数据將会被自动清除
临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的
1. ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后表中所有数据都被删除;
  

想更改的表如果在所属的模式中,用户必须具有 ALTER TABLE 数据库创建表的命令权限;若在其他


当一个表鈈再使用时可以将其删除。删除表时将产生以下结果:
1. 表的结构信息从数据字典中删除,表中的数据不可访问;
2. 表上的所有索引和触發器被一起清除;
3. 所有建立在该表上的同义词、视图和存储过程变为无效;
4. 所有分配给表的簇标记为空闲可被分配给其他的数据库创建表的命令对象。
一般情况下普通用户只能删除自己模式下的表。若要删除其他模式下的表则必须具有DROP ANY TABLE 数据库创建表的命令权限。
如果偠删除的表被其他表应用即其他表的外键引用了表的任何主键或唯一键,则需要
  

  

4.10查看自增列信息

  

DM 支持 INT 和 BIGINT 两种数据类型的自增列并提供鉯下函数查看表上自增列当
前值、种子和增量等信息:
2. IDENT_SEED:获得表上自增列的种子信息;
3. IDENT_INCR:获得表上自增列的增量信息。
  

4.11查看表的空间使用凊况

  

  
  

列存储是以列为单位进行存储的每一个列的所有行数据都存储在一起,而且一个指定的页面中存储的都是某一列的连续数据Huge File System(检查 HFS)是达梦数据库创建表的命令实现的,针对海量数据进行分析的一种高效、简单的列存储机制列存储表(也称为 HUGE 表)就是建立在 HFS 存储機制上的一种表。
HUGE 表与普通行表一样可以进行增、删、改操作,操作方式也是一样的但 HUGE表的删除与更新操作的效率会比行表低一些,並发操作性能也会比行表差一些因此在HUGE中不宜做频繁的删除及更新操作。总之HUGE 表比较适合做分析型表的存储。
HUGE表建立在自己特有的表涳间HTS上最多可创建32767个HUGE表空间,相关信息存储动态视图在V$HUGE_TABLESPACE中HUGE表是通过HTS存储机制来管理的,姓党与一个文件系统创建一个HTS,就是创建要给涳的文件目录。在创建一个 HUGE 表并插入数据时数据库创建表的命令会在指定的 HTS 表空间目录下创建一系列的目录及文件。
成功创建HUGE表需以丅步骤:
1)在HTS目录下创建这个表对应的模式目录,录名为“SCH+长度为9的ID号”组成的字符串
2)在模式目录下创建对应的表目录。表目录名为”TAB+长度为4的ID号”表目录中存放的是这个表中所有的文件。
3)在新创建表后插入数据时每一个列对应一个以dta为后缀的文件,文件大小可鉯在建表时指定默认为64M,文件名为”COL+长度为4的列号_长度为10的行号”
系统对于一个文件,其内部存储是按照区来管理的区是文件内部數据管理的最小单位,也是唯一的单位一个区中,可以存储单列数据的行数是在创建表时指定的一经指定,在这个表的生命过程就不能再修改所以,对于定长数据一个区的大小是固定的;而对于变长数据,一般情况下区大小都是不相同的每一个区的开始位置及长喥在文件内都是 4K 对齐的。
HUGE 表的存储方式有以下几个优点:
1. 同一个列的数据都是连续存储的可以加快某一个列的数据查询速度;
2. 连续存储的列数据,具有更大的压缩单元和数据相似性可以获得远优于行存储的压缩效率,压缩的单位是区;
3. 条件扫描借助数据区的统计信息进行精确过滤可以进一步减少 IO,提高扫描效率;
4. 允许建立二级索引;
5. 支持以 ALTER TABLE 的方式添加或者删除 PK 和 UNIQUE 约束会自动创建新的文件來存储不断增长的数据。
  

  


  
  

5.4查看数据存储情况

  

HUGE 表有一个很好的特点就是有 AUX 辅助表其中用户可以利用的信息很多,因为每一条记录对应一个區所以可以查看每一个区的存储情况,每一个列的存储情况及每一个列中具有相同区ID的所有数据的情况等还包括了很精确的统计信息,用户可以通过观察AUX辅助表中的信息对表进行一些相应的操作
  

分区是指将表、索引等数据库创建表的命令对象划分为较小的可管理片段嘚技术,每一个片段称为分区子表或分区索引一个表被分区后,对表的查询操作可以局限于某个分区进行而不是整个表,这样可以大夶提高查询速度
1. 减少所有数据都损坏的可能性,一个表空间损坏不影响其他表空间提高可用性;
2. 恢复时间大大减少;
3. 可以将同一个表Φ的数据分布在不同的磁盘上,从而均衡磁盘上的 I/O 操作;
4. 提高了表的可管理性、可利用性和访问效率
分区表建议取消主键,建唯一性本哋索引防止数据重复
如果表中一定要主键则分区范围一定要包含主键列
  

6.2创建范围(range)分区表

  

范围(range)水平分区:对表中的某些列上值的范围進行分区,根据某个值的范
围决定将该数据存储在哪个分区上;范围分区非常适用于数据按时间范围组织的表,不同的时间段的数据属於不同的分区
P3的上届值设定为maxvalue,下届为p2的上届4且包含设定的上届值:
当在分区表中执行 DML 操作时,实际上是在各个分区子表上透明地修妀数据当执行SELECT 命令时,可以指定查询某个分区上的数据

对于字符型数据,取值比较固定的适合于采用 LIST 分区的方法。
  

在很多情况下鼡户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 LIST 分区在这种情况下,DM 哈希分区提供了一种在指定数量嘚分区中均等地划分数据的方法基于分区键的散列值将行映射到分区中。当用户向表中写入数据时数据库创建表的命令服务器将根据┅个哈希函数对数据进行计算,把数据均匀地分布在各个分区中在哈希分区中,用户无法预测数据将被写入哪个分区中
  
  

6.4.2指定哈希分区個数建立哈希分区表

  

使用这种方式建立的哈希分区表分区名是匿名的,DM 统一使用DMHASHPART+分区号(从 0 开始)作为分区名
执行以下语句进行查询。
  

茬很多情况下经一次分区并不能精确地对数据进分类,这时需要多级分区表
  

只能对范围分区和 LIST 分区增加分区,不能对哈希分区增加分區并且增加分区不会影响分区索引,因为分区索引只是局部索引新增分区仅是新增分区子表,并更新分区主表的分区信息其他分区並不发生改变。
  

6.6.1范围表增加分区

  

用 ALTER TABLE ADD PARTITION 语句将新分区增加到最后一个现存分区的后面对于范围分区,增加分区必须在最后一个分区范围值的後面添加要想在表的开始范围或中间增加分区,应使用 SPLIT PARTITION 语句
  

对于 LIST 分区,增加分区包含的离散值不能已存在于某个分区中
  

只能对范围汾区和 LIST 分区进行删除分区,哈希分区不支持删除分区跟增加分区一样,删除分区不会影响分区索引因为分区索引只是局部索引,删除汾区仅是删除分区子表并更新分区主表的分区信息,其他分区并不发生改变
  

采用数据字典信息交换的技术,几乎不涉及 IO 操作因此效率非常高。仅范围分区和 LIST 分区支持交换分区哈希分区表不支持。并且分区交换要求分区表跟交换表具有相同的结构(相同的表类型、相哃的 BRANCH 选项、相同的列结构、相同的索引、相同的分布方式)分区交换但并不会校验数据,如交换表的数据是否符合分区范围等即不能保证分区交换后的分区上的数据符合分区范围。
进行交换的两张表如果包含加密列,对应的加密列要求加密信息完全一致

仅范围分区表支持合并分区,并且合并的分区必须是范围相邻的两分区另外,合并的分区会导致数据的重组和分区索引的重建因此,合并分区可能会比较耗时所需时间取决于分区数据量的大小。
  

仅范围分区表和 LIST 分区表支持拆分分区拆分分区另一个重要用途是作为新增分区的补充。通过拆分分区可以对范围分区表的开始或中间范围添加分区。另外拆分分区会导致数据的重组和分区索引的重建,因此拆分分區可能会比较耗时,所需时间取决于分区数据量的大小
  

DM8索引能提供访问表的数据更快的路径,可以更快地定位信息索引在逻辑上和物
悝上都与相关的表的数据无关,作为无关的结构索引需要存储空间。创建或删除一个索引不会影响基本的表、数据库创建表的命令应鼡或其他索引。当插入、更改和删除相关的表的行时DM8 会自动管理索引。如果删除索引所有的应用仍继续工作,但访问以前被索引了的數据时速度可能会变慢
  

  
  

1. 聚集索引:每一个普通表有且只有一个聚集索引;
2. 唯一索引:索引数据根据索引键唯一;
3. 函数索引:包含函数/表達式的预先计算的值;
4. 位图索引:对低基数的列创建位图索引;
5. 位图连接索引:针对两个或者多个表连接的位图索引,主要用于数据仓中;
6. 全文索引:在表的文本列上而建的索引
  

7.2.2明确地创建索引

  

可在STORAGE语句中指定存储设置和表空间。
  

7.2.3创建聚集索引

每一个普通表都有且仅有一個聚集索引数据都通过聚集索引键排序,根据聚集索引键可以快速查询任何记录

建表后,DM8 也可以用创建新聚集索引的方式来重建表数據并按新的聚集索引排序。但是新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引是一个代价非常大的操作。

7.2.4創建唯一索引

用户可以在希望的列上定义 UNIQUE 完整性约束DM8 通过自动地在唯一键上定义一个唯一索引来保证 UNIQUE 完整性约束。

7.2.5自动创建与约束相关嘚唯一索引

DM8 通过在唯一键或主键上创建一个唯一索引来在表上实施 UNIQUE KEY 或 PRIMARYKEY 完整性约束当启用约束时DM8自动创建该索引。

7.2.6基于函数的索引

基于函數的索引促进了限定函数或表达式的返回值的查询该函数或表达式的值被预先计算出来并存储在索引中。

位图索引主要针对含有大量相哃值的列而创建对低基数(不同的值很少)的列创建位图索引,能够有效提高基于该列的查询效率且执行查询语句的 where 子句中带有 AND 和 OR 谓詞时,效率更加明显

7.2.8位图链接索引

位图连接索引是一种提高通过连接实现海量数据查询效率的有效方式,主要用于数据仓库环境中位圖连接索引是针对两个或者多个表的连接而建立的位图索引,同时保存了连接的位图结果对于索引列中的每一个值,位图连接索引在索引表中保存了对应行的 ROWID

7.2.9查看表的索引

当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片从而影响访问速度。另外当删除表的大量数据后,若不再对表执行插入操作索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间可以使鼡重建索引来对索引的数据进行重组,使数据更加紧凑并释放不需要的空间,从而提高访问效率和空间效率

要想删除索引,则该索引必须包含在用户的模式中或用户必须具有 DROP ANY INDEX数据库创建表的命令权限索引删除之后,该索引的段的所有簇都返回给包含它的表空间并可鼡于表空间中的其他对象。

触发器(TRIGGER)定义为当某些与数据库创建表的命令有关的事件发生时数据库创建表的命令应该采取的操作。

这些事件包括全局对象、数据库创建表的命令下某个模式、模式下某个基表上的 INSERT、DELETE 和

UPDATE 操作触发器是在相关的事件发生时由服务器自动地隐式地噭发。

触发器是一种用来保障参照完整性的特殊的存储过程它维护不同表中数据间关系的有关规则。

触发器分为表触发器、事件触发器囷时间触发器表触发器是对表里数据操作引发的数

据库的触发;事件触发器是对数据库创建表的命令对象操作引起的数据库创建表的命囹的触发;时间触发器是一种特殊

DIsql中,创建触发器时需用“/”结束

8.1.1创建表触发器

INSTEAD OF:仅用于视图上的触发器,表示用触发器体内定义的操莋代替原操作

一种、两种或者三种命令能够激发该触发器则可以指定它们之间的任意组合,两种同的命令之间用 OR 分开如果指定了 UPDATE 命令,还可以进一步指定当表中的哪个列受到UPDATE 命令的影响时激发该触发器

FOR EACH ROW:指定创建的触发器为元组级触发器。如果没有这样的子句则创建触

发器为语句级触发器。INSTEAD OF 触发器固定为元组级触发器

在触发器中可以定义变量,但必须以 DECLARE 开头触发器也可以进行异常处理,如

果发苼异常就执行相应的异常处理程序。

8.1.2创建时间触发器

时间触发器是一种特殊的事件触发器时间触发器的特点是用户可以定义在任何时間点、

时间区域、每隔多长时间等等的方式来激发触发器,而不是通过数据库创建表的命令中的某些操作包括

DML、DDL 操作等来激发它的最小時间精度为分钟。

时间触发器实用性很强如在凌晨(此时服务器的负荷比较轻)做一些数据的备份操作,

对数据库创建表的命令中表的統计信息的更新操作等类似的事情同时也可以作为定时器通知一些用户在

未来的某些时间要做哪些事情。

视图是关系数据库创建表的命囹系统提供给用户以多种角度观察数据库创建表的命令中数据的重要机制从系统实

现的角度讲,视图是从一个或几个基表(或视图)导絀的表但它是一个虚表,即数据字典中只存放视图的定义(由视图名和查询语句组成)而不存放对应的数据,这些数据仍存放在原来嘚基表中

DM 提供了一些以"V$"开头的视图来供用户了解当前服务器的使用情况。用户对动态性能视图只能进行查询操作

视图分为简单视图,複杂视图物化视图注:简单视图和复杂视图不占磁盘空间,物化

WITH CHECK OPTION:指明往该视图中 insert 或update 数据时插入行或更新行的数据必须满足视图定义Φ<查询说明>所指定的条件。只有当视图是可更新的时候才可以选择 WITH CHECK OPTION 项。(MPP系统不支持)

[LOCAL|CASCADED:当通过视图向基表中 insert 或 update 数据时LOCAL|CASCADED 决定了满足 CHECK 条件的范围。指定 LOCAL要求数据必须满足当前视图定义中<查询说明>所指定的条件;指定 CASCADED,数据必须满足当前视图以及所有相关视图定义中<查詢说明>所指定的条件。

WITH READ ONLY:指明该视图是只读视图只可以查询。

视图也可以建立在多个基表之上

一个视图依赖于其基表或视图,如果基表定义发生改变如增删一列,或者视图的相关

权限发生改变可能导致视图无法使用。在这种情况下可对视图重新编译,检查视图的匼

视图数据的更新包括插入(INSERT)、删除(DELETE)和修改(UPDATE)三类操作由于视图是虚表,并没有实际存放数据因此对视图的更新操作均要转换成对基表的操作。

1. 如果视图建在单个基表或单个可更新视图上且该视图包含了表中的全部聚集索引

键,则该视图为可更新视图;

2. 如果视图由两个以仩的基表导出时则该视图不允许更新;

3. 如果视图列是集函数,或视图定义中的查询说明包含集合运算符、GROUP BY 子句

或 HAVING 子句则该视图不允许哽新;

4. 如果视图的基表为远程表,则该视图不允许更新;

5. 在不允许更新视图之上建立的视图也不允许更新

CASCADE方式都会成功,且只会删除当湔视图不会删除建立在该视图上的视图;

物化视图是从一个或几个基表导出的表,同视图相比它存储了导出表的真实数据。当

基表中嘚数据发生变化时物化视图所存储的数据将变得陈旧,用户可以通过手动刷新或自

动刷新来对数据进行同步

序列(sequence)是 DM 数据库创建表嘚命令中的数据库创建表的命令实体之一。通过使用序列多个用户可以

产生和使用一组不重复的有序整数值。比如可以用序列来自动地苼成主关键字值序列通过提供唯一数值的顺序表来简化程序设计工作。

tt1.seq_s1.nextval就是一个你设置好最大最小值增长模式的数值,可以插入在表Φ

同义词相当于模式对象的别名,起着连接数据库创建表的命令模式对象和应用程序的作用假如模式对象需要更换或者修改,则不用修改应用程序而直接修改同义词就可以了

同义词是用来实现下列用途的数据库创建表的命令对象:

1. 为可以存在于本地或远程服务器上的其他数据库创建表的命令对象(称为基础对象)提供备用名

2. 提供抽象层以免客户端应用程序对基础对象的名称或位置进行更改。

同义词的恏处在于用户可能需要某些对象在不同的场合采用不用的名字使其适合不同

人群的应用环境。例如创建表 product,如果客户不认识这个英文詞这时可以增加同义

词,命名―产品‖这样客户就有较直观的观念,一目了然同义词可以替换模式下的表、视图、序列、函数、存儲过程等对象。

1.<同义词名> 指被定义的同义词的名字;

2.<对象名> 指示同义词替换的对象

自增列即标识列,它是表层面的是列的一种属性,标识列的作用是在表(仅限单个表)

中添加行时自动生成列值;sequence序列是一种数据库创建表的命令对象它相对于表来说是独立的,特別适合生成唯一键值这个任务序列不与特定表列相关,任何SQL语句都可以使用序列的值

DM 支持 INT 和 BIGINT 两种数据类型的自增列,并提供以下函数查看表上自增列当前值、种子和增量等信息:

2. IDENT_SEED:获得表上自增列的种子信息;

3. IDENT_INCR:获得表上自增列的增量信息

设置是否允许将显式值插入表的自增列中。

 <ORACLE外部链接串>可以使用配置的网络服务名tsn_name(网络服务名需要配置)或者连接描述符 description(连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主库 IP 地址、端口号和服务名)或者<IP 地址>/<服务名>;

我要回帖

更多关于 数据库创建表的命令 的文章

 

随机推荐