zoukankan      html  css  js  c++  java
  • 面试题——数据库

     事务:

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

    四大特效:

    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复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

     

     

  • 相关阅读:
    sql语句清除mssql日志
    常用的一些webshell木马官方后门
    32个触发事件XSS语句的总结
    XSS的高级利用部分总结 -蠕虫
    IIS7 Appcmd.exe 使用
    PHP Execute Command Bypass Disable_functions
    仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell
    win95+ie3-win10+ie11 浏览器执行漏洞
    SQL 、NoSQL数据库教程
    Pytorch快速入门及在线体验
  • 原文地址:https://www.cnblogs.com/winterfells/p/9432206.html
Copyright © 2011-2022 走看看