-
Oracle数据库是什么
-
数据库是持久化数据管理系统
-
SQL是什么
-
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
-
作用:用于存取数据、查询、更新和管理关系数据库系统。
-
MYSQL和Oracle的区别
-
MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
-
分页查询: MySQL是直接在SQL语句中写"select... from ...where...limit x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询
-
事务隔离级别: MySQL是read commited(提交读)的隔离级别,而Oracle是repeatable read(可重复读)的隔离级别
-
MySQL是轻量型数据库,并且免费,没有服务恢复数据。Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务
-
MySQL的分区表还不太成熟稳定。 Oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
-
MYSQL底层是B+树,Oracle底层是B树
-
B树和B+树的区别
-
区别有以下两点:
-
B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
-
B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
-
B+树的优点:
-
非叶子节点不会带上ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。
-
叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。
-
B树的优点:
-
对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。
-
数据库的应用场景
-
数据需要永久保存
-
系统需要管理数据
-
数据库的优缺点
-
数据保存在内存
-
优点:存取数据快
-
缺点:数据不能永久保存
-
存在文件里
-
优点:数据可以永久报春
-
缺点:频繁的IO操作,性能慢,读写慢,查询数据不方便
-
保存在数据库
-
数据永久保存
-
使用SQL语句,查询效率高
-
管理数据方便
-
数据库技术的原理和核心
-
数据库三范式是什么?
-
第一范式:每个列都不可以再拆分。
-
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
-
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
-
数据库事务四大特性ACID(数据库的事务管理)
-
事务的意义
-
事务可以将一系列的数据操作捆绑成一个整体进行统一的管理,如果某一事务执行成功,则该事务中进行的所有数据均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误,则就是必须取消或回滚。取消或回滚后,数据将全部恢复到操作前的状态,所以数据更改均被消除。
-
Mysql 通过事务保证数据的一致性
-
四大特性
-
原子性:一个事务是一个不可分割的最小工作单元,其操作要么全部成功,要么全部失败
-
一致性:数据库总是从一个一致性状态转换为另一个一致性状态。所谓一致性状态,就是数据库的所有完整性约束(尤其注意用户定义约束)都被遵守,以银行转账为例,“转账操作必然导致一个账户减少金额,另一个账户增加金额,且这两个账户总金额之和不变”就是一个完整性约束。
-
持久性:一旦事务提交,则其所作的修改就会永久保存到数据库中。
-
隔离性:隔离性用于定义事务之间的相互隔离程度,存在四个隔离级别。
-
事务隔离
-
产生的问题
-
脏读: 表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
-
不可重复读: 是指在一个事务内,多次读同一数据。比如,事务A要读取数据两次,先读取了一次,然后事务B更改了此数据,当事务A再读取时与第一次读的不是同一个数据。
-
幻读: 指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
-
隔离级别
-
READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
-
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
-
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
-
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
-
Oracle的使用方式
-
三种语言类型
-
DML 数据操纵语言,用于查询和修改数据
-
增:INSERT 表 INTO (表字段)VALUES (值)
-
删:truncate、delete、drop的区别
-
用法:truncate 表名;delete from 表名 where...;drop table 表名;
-
truncate、drop是不可以rollback的,但是delete是可以rollback的;原因是:delete删除是一行一行的删除,会触发触发器,删除可以返回行数,每删除一行会进行一次日志记录,所以可回滚;而truncate删除是删除表的所有数据,通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,所以不能回滚,可以重置自增字段的计数器;Drop语句将删除表的结构、被依赖的约束(constrain)、触发器 (trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。
-
注意:drop、truncate不能删除有外键约束的表。
-
改: UPDATE 表名SET 修改的数据字段 = 值 WHERE 条件
-
查:
-
单表查询:公式是SELECT 字段 FROM 表名 WHERE 条件 GROUP BY(分组)HAVING ORDER BY
-
多表查询:自关联,左关联,右关联,子查询
-
DCL 定义数据库权限
-
给用户授权
-
GRANT 权限 TO 用户
-
收回权限REVOKE 权限 TO
-
DDL数据定义语言
-
创建表
-
修改表
-
删除表
-
常用函数
-
DISTINCT() 去重函数
-
SUM()求和 MAX()最大值
-
LOWER()变小写UPPER()变大写
-
length长度、to_date转化日期、to_char转化字符、to_number转化数字Ltrim去左边空格、rtrim去右边空格、substr截取字符串、add_month增加或减掉月份
-
to_date('20190516 10:12:50','yyyyMmdd HH24:mi:ss'
-
数据库性能优化相关
-
数据库访问优化法则(详细如数据库优化博客)
-
减少数据访问(减少磁盘访问)
-
索引的类型
-
ORacle的索引类型
-
MYsql的索引类型
-
普通索引:仅加速查询
-
唯一索引:加速查询 + 列值唯一(可以有null)
-
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
-
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
-
全文索引:对文本的内容进行分词,进行搜索
-
验证索引的命中
-
索引创建 create index 索引名 on 表名(列名)
-
不会使用索引,权标扫描
-
返回更少数据(减少网络传输或磁盘访问)
-
数据分页处理
-
只返回需要的字段
-
减少交互次数(减少网络传输)
-
减少服务器CPU开销(减少CPU及内存开销)
-
利用更多资源(增加资源)
-
数据库优化架构方向
-
调整数据库结构的设计:需要考虑是否使用分区功能、是否建立索引等
-
调整数据库的SQL语句
-
调整服务器的内存分配
-
调整硬盘I/O
-
调整操作系统参
-
数据库优化总结
-
数据块和rowid
-
数据块是什么
-
数据块是数据库中数据在磁盘中存储的最小单位,也是一次IO访问的最小单位,一个数据块通常可以存储多条记录,数据块大小是DBA在创建数据库或表空间时指定,可指定为2K、4K、8K、16K或32K字节。下图是一个Oracle数据库典型的物理结构,一个数据库可以包括多个数据文件,一个数据文件内又包含多个数据块;
-
rowid是什么
-
ROWID是每条记录在数据库中的唯一标识,通过ROWID可以直接定位记录到对应的文件号及数据块位置。ROWID内容包括文件号、对像号、数据块号、记录槽号,如下图所示:
-
Oracle的相关问题
-
MySQL的锁机制
-
为什么有锁
-
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
-
就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。
-
锁和隔离级别的关系
-
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
-
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
-
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
-
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
-
按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法
-
在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
-
MyISAM和InnoDB存储引擎使用的锁:
-
MyISAM采用表级锁(table-level locking)。
-
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
-
锁的分类
-
行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
-
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
-
答:InnoDB是基于索引来完成行锁
-
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起
-
表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
-
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
-
页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
-
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
-
总结:锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。
-
从锁的类别上分MySQL都有哪些锁呢?
-
共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
-
排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
-
悲观锁和乐观锁
-
悲观锁(修改,插入数据)
-
最坏的情况,每次都锁表,传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
-
乐观锁(多读场景)适用于写比较少的情况下
-
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。
-
乐观锁一般会使用版本号机制或CAS(Compare-and-Swap,即比较并替换)算法实现。
-
版本号机制
-
数据表中加上一个数据版本号version字段控制。
-
CAS算法是一种有名的无锁算法。
-
当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作,不断的尝试,直到成功为止。
-
CAS适用于写比较少的情况下(多读场景,冲突一般较少),synchronized适用于写比较多的情况下(多写场景,冲突一般较多)
-
存储过程
-
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
-
优点:
-
存储过程是预编译过的,执行效率高。
-
存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
-
安全性高,执行存储过程需要有一定权限的用户。
-
存储过程可以重复使用,减少数据库开发人员的工作量。
-
缺点:
-
调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
-
移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
-
重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
-
如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
-
存储过程怎样使用
-
create or replace procedure 存储过程名称
-
(--定义输入、输出参数--参数名1 in 参数类型,)
-
as--定义变量--
-
--变量名 变量数据类型;如:
-
-- numCount integer; begin
-
--处理方法-end;
-
数据库恢复和克隆
-
通过SCN恢复删除且已提交的数据(可修改30分钟以内)
-
通过时间恢复删除且已提交的数据(默认可恢复30分钟以内)