美文网首页
java高频面试总结(mysql篇)

java高频面试总结(mysql篇)

作者: 吗丁啉要餐前吃 | 来源:发表于2019-09-27 10:50 被阅读0次

    1.mysql常用的索引有哪些种类?

    答:
    1)普通索引:针对数据库表创建索引
    2)唯一索引:索引列值必须唯一,允许有空值
    3)主键索引:特殊的唯一索引,不允许控制
    4)组合索引:将数据库表中多个字段联合起来作为一个索引
    5)聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构保存了 B-Tree索引(技术上来说是B+Tree)和数据行。

    聚集索引与非聚集索引的区别是:页节点是否存放一整行记录。每张表只能拥有一个聚集索引。

    2.mysql数据库中索引的工作机制?

    答: 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树。

    3.MySQL中InnoDB支持的四种事物隔离级别名称,以及逐级之间的区别?

    答:
    1)Read Uncommitted(读取未提交内容)
    所有事务都可以读取到其他未提交事务的执行结果。也被称为脏读(Dirty Read)

    2)Read Committed(读取提交内容)
    这个是大多数数据库默认的隔离级别(但不是MySQL默认的)。满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种事务也支持所谓的不可重复读,因为同一个事务的其他实例在该实例处理期间可能会有新的commit,所以同一select可能但会不同结果。

    3)repeatTable read(可重复读)
    这个是mysql的默认事务隔离级别,确保同一事务的多个实例在并发读数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手问题:幻读。InnoDB 和 Falcon 存储引擎通过多版本并发控制( MVCC, Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。

    4)Serializable(可串行化)
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

    4.MySql事务并发问题

    答:
    1)脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么A读到的数据是脏数据。
    2)不可重复读:事务 A 多次读取同一条数据,事务 B 在事务 A 多次读取的过程中,对数据做了更新操作,导致事务 A 多次读取统一数据时,结果不一致。
    3)幻读:系统管理员 A 将数据库中所有学生的成绩从具体分值改为ABCDE五个等级,就在这个系统管理员 B 插入一条具体分数记录,A 修改结束后发现还有一条没有修改过来,好像发生幻觉,这就叫幻读。

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

    5.设置事务隔离级别及可能导致的问题

    答:
    set transaction isolation level 设置事务隔离级别
    select @@tx_isolation 查询当前事务隔离级别

    image.png

    6.mysql的InnoDB引擎支持行锁,那么有哪些类型的锁?

    答:
    共享锁:(S读锁)。当一个事务对某几行上读锁时,允许其他事务对着几行进行读操作,但不允许写操作。也不允许其他事务给这几行上排他锁,但允许上读锁。语法:select * from 表 where 条件 lock in share mode

    排它锁:(X写锁)。当一个事务对某几行上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。语法:select * from 表 where 条件 for update;

    1.两个事物不能锁同一个索引;
    2.insert ,delete , update在事务中都会自动默认加上排它锁;
    3.行锁必须要有索引才能实现,否则会自动锁全表,那么就不是行锁了。

    7.mysql索引为什么使用B+树,而不使用B树,或者二叉树呢?

    答:
    首先,B+tree的B是balance(平衡)的意思,而不是binary,不代表二叉。因此,每个树节点的子节点上不止有两个叶子节点。在mysql中每一个索引对应了一个B+Tree。
    B+Tree有以下几个特点:
    1)每个节点可以存储多个元素,减少了树的深度。
    2)每个非叶子节点都会在叶子节点冗余一份(与B-Tree的不同)。
    3)非叶子节点不会存储具体的数据(这个是与B-Tree的区别),利用了操作系统的局部性原理
    4)叶子节点都是从左向右升序的,同时叶子节点有指向相邻节点的指针。

    局部性原理:原理一两句说不清楚,说一下具体用处吧。打比方,操作系统每次去读取数据,都是从磁盘中读取4KB的数据,加载到内存中的(这个属于磁盘的预读机制)。那么我们保证树节点的数据量刚好是4KB,那么就能降低读取磁盘IO操作的次数,从而快速的取到数据了。

    那么,使用B+Tree的原因就一目了然了,降低了树的高度,减少了IO的次数,提高了查询效率。

    8.说一下什么是回表?

    答:举个例子,比如我有一张表,字段为:id,name,age,sex,score等。id为主键,我对name和age建立了一个组合索引(辅助索引)。执行select * from table where name="zhang" and age=20的时候,由于mysql索引的建立机制,我通过index_name_age索引查询到的数据只包含 id。因此,需要再通过 id 索引进行一次数据查找,这样的操作就成为回表。

    mysql索引的建立机制:建立主键索引,对应的B+Tree在叶子节点包含该行所有的全部字段;建立辅助索引,对应的B+Tree在叶子节点只会包含索引的值以及该行对应的主键,所以select * 需要再通过主键索引查找。

    9.说一下MySql的mvcc。

    答:多版本控制,利用redo_log(每次数据变更,都会保存redo日志)保证事务的持久性;undo_log负责回滚,保存一条与事务操作相反的sql记录,比如:执行insert操作,就会往undo日志插入一条对应的删除语句;delete-->insert;update --> update回去。

    相关文章

      网友评论

          本文标题:java高频面试总结(mysql篇)

          本文链接:https://www.haomeiwen.com/subject/hduguctx.html