MySQL数据库面试复习(基础)

目录

    • 数据库引擎
      • InnoDB
        • MVVC
        • 事务
          • 事务的特性
          • 隔离级别
      • MyISAM
        • 锁机制
          • 锁粒度
        • 不同引擎
          • InnoDB
          • MyISAM
    • 索引
      • 索引的实现
        • 为什么采用B+树
      • 索引的种类
        • 根据数据结构划分
      • 聚簇索引
      • 非聚簇索引

数据库引擎

InnoDB

是MySQL5.5之后的默认引擎,支持事务ACID,特点是行锁设计,支持MVVC(多版本并发控制)。
InnoDB通过间隙锁(next-key locking)防止幻读的出现。InnoDB是基于聚簇索引建立,与其他存储引擎有很大的区别,聚簇索引对主键查询有很高的性能,不过它的二级索引(secondary index,非主键索引)必须包含主键列。所以如果主键列很大的话,索引会很大。

MVVC

使得大部分支持行锁的数据库不再依赖行锁进行并发控制,却而代之的是行锁和行的多版本结合起来,只需要很小的开销就可以实现非锁定读。

事务

事务的特性
  • 原子性 一组操作要么全部执行,要么全部不执行,执行错误就进行回滚
  • 一致性 事务开始前和事务结束后,数据的完整性约束没有被破坏(比如A向B转账,A钱少了,B却没收到)
  • 隔离性 同一时间只允许同一个事务对同一个数据进行操作,不同的事务间没有影响

不考虑隔离性会出现以下问题:

  1. 脏读:一个事务读取了另一个事务未提交的脏数据
  2. 不可重复读:一个事务多次查询同一个数据,结果却不一样。读取了其他事务提交的数据
  3. 虚读(幻读):幻读和不可重复读类似,读取了其他事务提交的数据,但是幻读指读取一群数据整体中发现某个不应该出现的错误,像出现了幻觉。
  • 持久性 数据一但改变,便永久改变
隔离级别

隔离级别越高,执行效率越低。

  • 读未提交 Read Uncommitted — 未提交的数据也可以被读,会出现脏数据
  • 已提交读 Read Committed — A修改的数据,B读,A又修改,B再读数据不一致。出现不可重复读,可避免脏读
  • 可重复读 Repeatable Read — A操作数据,B不管读多少次都读的是A开始前的快照数据。可避免不可重复读、脏读
  • 串行化 Serializable — 不允许独写并发操作,写数据时不允许读。可避免脏读、幻读、不可重复读
    MySQL的默认级别是可重复读,但是配合间隙锁,等级可达到串行化

MyISAM

特点:

  1. 不支持事务
  2. 不支持外键
  3. 查询速度很快。如果数据库insert和update的操作比较多的话采用表锁效率低(建议使用innodb)
  4. 对表进行加锁

锁机制

  1. 乐观锁
    乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
  2. 悲观锁
    悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间.共享锁和排他锁相当于悲观锁的具体实现。
    i. 共享i锁 S(读锁)
    其他事务可以读,但是不可以写
    ii. 排他锁 T(写锁)
    其他事务不可以读,也不可以写
锁粒度

默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令。

  1. 表锁
    开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用
  2. 页锁
    开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  3. 行锁
    开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统
  4. 间隙锁
    间隙锁加在两条记录之间,目的是为了防止其他事务在间隔中插入数据,以导致“不可重复读”。间隙锁只在可重复读(RR)级别以上生效

不同引擎

InnoDB
  • InnoDB自动加意向锁,不需要用户干预
  • 对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB会自动给涉及数据集加排他锁(X);
  • 对于普通 SELECT 语句,InnoDB 不会加任何锁;
  • InnoDB 行锁是通过给索引上的索引项加锁来实现,只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!
MyISAM

只有表锁,不太适合于有大量更新操作和查询操作应用

  • 表共享读锁 (Table Read Lock):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
  • 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作;

索引

索引的实现

B+树:一个m阶的B+树具有如下几个特征:

  1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
  2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素

为什么采用B+树

结构 区别
红黑树 增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
B树(B-树) B树,查询性能不稳定,查询结果高度不致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。
B+树 B+树相比较于另外两种树,显得更矮更宽,查询层次更浅

索引的种类

  1. 普通索引
    MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
  2. 唯一索引
    索引列中的值必须是唯一的,但是允许为空值,
  3. 主键索引
    是一种特殊的唯一索引,不允许有空值。
  4. 组合索引
    在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合(必须匹配最左边的)
    这里注意,覆盖索引包含要查找的所有列,在InnoDB中很实用。可以减少IO,避免主键索引的二次查询,解决回表问题
  5. 全文索引
    全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。

根据数据结构划分

Hash索引:等值查询效率高,不能排序,不能进行范围查询,适用于k-v型数据库 例如redis
B+索引:数据有序,适合范查询

聚簇索引

聚簇索引就是数据和索引放在一起。因此一个表只有一个聚簇索引。InnoDB中默认聚簇索引。默认主键生成聚簇索引。如果没有主键则隐形设定一个主键。InnoDB中的其他索引称为辅助索引。在聚簇索引中查询除主键意外的列,需要查询两次(称为回表查询先查询到对应的主键,再用主键查询,第二次查询时,本页数据已经被加载到内存中,比较快,可以使用覆盖索引解决)。索引和数据的物理空间是一一对应的,所以建议主键设置自增,这样在磁盘上写的数据规整,不会有太多碎片

非聚簇索引

非聚簇索引指索引中存放行数据的地址。

参考连接:
https://www.jianshu.com/p/21b6c82a5981
https://www.cnblogs.com/liqiangchn/p/9066686.html
https://zhuanlan.zhihu.com/p/29150809
https://cloud.tencent.com/developer/article/1125452
https://blog.csdn.net/qq_22222499/article/details/79060495

你可能感兴趣的:(面试复习)