面试题——数据库

 

 事务:

 

一个数据库事务通常包含对数据库进行读或写的一个操作序列。

四大特效:

A:原子性:要么成功提交,要么失败回滚。

C: 一致性:事务提交前后数据库保持一致性。

I: 隔离性:每个事务的操作互不影响。

D: 持久性:事务一旦成功提交,对数据库的影响是永久的,即使数据库奔溃。

 

 

 

 隔离性的四个级别

 

 

  1. 脏读:读了事务未提交的数据。

  2. 不可重复读:读了事务前一次提交的结果(对于同一个数据而言)。

  3. 幻读:读了事务提交的结果,对于同一批数据而言。比如事务A对表的数据进行修改后,B插入了一条数据。

 四个级别:

  1. 读未提交:级别最低。导致脏读、不可重复读、幻读。

  2. 读已提交:只能提取事务提交的结果。读操作加锁后,读取成功后立即释放。但是写锁要等到修改提交成功后才释放。导致不可重复读和幻读。

  3. 可重复读:事务不能读取未提交的结果,数据被读取后不能再被修改,但可以添加数据。导致幻读。

  4. 串行化:对事务读写加锁,事务只能一个个执行。但是执行效率最低。

 

 

 索引的优缺点:

 

CREATE UNIQUE INDEX index_name ON table_name (column_list)

索引是对数据库表的一列或者多列的值进行排序的一种数据结构,使用索引,可以快速访问数据库表中特定的信息。

优点:加速查询速度;用于多表的连接;创建唯一性索引,可以保证表中每一行都具有唯一性;在分组、排序字句中可以加快检索的速度;可以用于范围查询。

缺点:需要额外创建索引、维护索引的消耗;索引需要额外的物理空间;当对表中数据进行增删修改时,需要额外维护索引。

 

 

 

 索引的数据结构:

 

B树、B+树。因为树的查询效率高而且可以保持有序。

 

 

 

 MySql的索引类型:

 

 

  数据结构:B+树索引:B-Tree的基本思想是,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,

 

hash索引:基于hash表。所以这种索引只支持精确查找,不支持范围查找,不支持排序。这意味着范围查找或ORDER BY都要依赖server层的额外工作。

FullText索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。Full-text索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的WHERE语句的参数匹配。

R-tree索引:用于查询比较接近的数据.

  功能:唯一索引:一个表中可以有多个唯一性索引,唯一性索引列允许空值。

主键索引:一个表中只能有一个主键索引,主键索引列不允许空值。

聚集索引:行的物理顺序与索引顺序相同。

外键索引:主要目的是控制存储在外键表中的数据。 使两张表形成关联。

 

 

 

 索引的使用场合和不适用场合

 

 

适用:用于经常需要查询操作的列上;

  用于需要排序的列上;

  用于连接表的列上(外键)。

不适用:很少被查询的列;

  数据值很少的列(比如性别);  

  数据值为image的列这种数据值也少;

  修改性能远远大于查询性能的列;

  Like%开头的;

  如果使用全表查询比索引快。

 

 

 什么时候索引失效

  当使用or的情况下,如果不是每一列的条件都有索引,索引失效

  当使用多列索引的时候,没有匹配到第一部分,索引失效

  当使用like的时候,以%开头,索引失效

  当数据类型是字符串类型的时候,如果条件数据没有被引号引起来,索引失效

  如果使用全表扫描比索引更快,索引失效

 

 

 为何不用二叉查找树

  当索引值多的时候,构建的二叉查找树深度深,使得IO读写过于频繁。而B树和B+树使得瘦高的二叉查找树变得矮胖,减少了IO读写次数。

 

 

 

 B树:

 

  1)根结点至少有两个子女。

  2)每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

  3)每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

  4)所有的叶子结点都位于同一层。

  5)每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

 

 B树的插入操作

  自顶向下查找4的节点位置,发现4应当插入到节点元素35之间

 

  节点35已经是两元素节点,无法再增加。父亲节点 26 也是两元素节点,也无法再增加。根节点9是单元素节点,可以升级为两元素节点。于是拆分节点35与节点26,让根节点9升级为两元素节点49。节点6独立为根节点的第二个孩子。

  优点:保持多路平衡。

 

  删除操作:

  自顶向下查找元素11的节点位置。

  删除11后,节点12只有一个孩子,不符合B树规范。因此找出12,13,15三个节点的中位数13,取代节点12,而节点12自身下移成为第一个孩子。(这个过程称为左旋

 

 B+树:

 

  每个节点上的指针上限为k+1

  非叶子节点只存储键值、指针,不存储数据。

  所有的数据都在叶子节点层。

 

 

  B+树和B-树相比的优缺点:

  B+树的优点:

  非叶子节点不存储数据,这样,一个节点中中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。

  叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。


  B-树的优点:

  对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。


  B+树和联合索引

  对数据库表中的多列数据,根据最左原则联合建立索引。优先按照按照第一个关键字进行索引排列的。

 

 

 连接:

 

  左连接:得到左表中所有记录,将右表中满足连接条件的记录附加在左表相应的记录中。如果左表的某条记录在右表中不存在,那么连接后该记录在右表中的属性值为null

 

  右连接:得到右表中所有的记录,将左表中满足连接条件的记录都附加在右表相应的记录中,不满足的相应记录记为null

  内连接:将两个表中共同的记录连接在一起。

  外连接:将两个表取并集,所有的记录连接在一起。

 

 

 

 JDBC连接:

  1. 加载JDBC驱动程序

  调用Class.forName()方法加载想要连接的数据库的驱动到JVMJava虚拟机)。

  1. 调用DriverManager对象的getConnection()方法,获得一个Connection对象。

  1. 创建一个Statement对象

执行静态SQL语句。通常通过Statement实例实现。

执行动态SQL语句。通常通过PreparedStatement实例实现。

执行数据库存储过程。通常通过CallableStatement实例实现。

 

   4.Statement接口提供了三种执行SQL语句的方法:executeQuery executeUpdateexecute.

 

 

   5.对返回的结果进行处理

 

 

   6.关闭JDBC连接

 

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:

  1. 关闭记录集 Resultset
  2. 关闭声明 Statement
  3. 关闭连接对象 Connection

 

 

MVCC:

 

MVCC:多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。
Mvcc处理高并发能力最强,在MVCC协议中,每个用户在连接数据库时看到的是一个具有一致性状态的镜像,每个事务在提交到数据库之前对其他用户均是不可见的。
当事务需要更新数据时,不会直接覆盖以前的数据,而是生成一个新的版本的数据,因此一条数据会有多个版本存储,但是同一时刻只有最新的版本号是有效的。
因此,读的时候就可以保证总是以当前时刻的版本的数据可以被读到,不论这条数据后来是否被修改或删除。

 

  INSERT

  InnoDB为每个新增行记录当前系统版本号作为创建ID。

  DELETE

  InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。

  UPDATE

  InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

 

 

 

posted @ 2018-08-06 19:46  冬日降临  阅读(253)  评论(0编辑  收藏  举报