MySQL面试重点

本文详细介绍了MySQL中的死锁原理及其预防策略,比较了聚簇索引和非聚簇索引的区别,讨论了InnoDB和MyISAM引擎的不同,阐述了事务的四大特性,探讨了并发事务可能导致的问题以及事务的隔离级别,还区分了having与where、on与where在SQL查询中的作用和join、leftjoin、rightjoin的用法。
摘要由CSDN通过智能技术生成

1. 阐述MySQL中的死锁

在MySQL中,死锁是指两个或多个事务相互持有对方所需的资源而无法继续执行的情况。

死锁在MySQL中可能发生的情况包括:

  • 并发更新或删除: 多个事务同时尝试更新或删除数据库中的数据行。
  • 持有并等待: 一个事务持有了一个资源的锁,并且等待另一个事务持有的资源的锁。
  • 循环等待: 多个事务之间形成了循环等待对方持有的资源。

为了减少死锁的发生,可以采取以下措施:

  • 尽量减少事务持有锁的时间: 将事务中的操作尽快完成,减少锁的持有时间。
  • 按相同顺序获取锁: 如果事务需要获取多个资源的锁,尝试按照相同的顺序获取锁,可以减少死锁的概率。
  • 合理设计事务逻辑: 避免在事务中频繁的更新或删除大量数据,尽量将事务拆分为小的操作单元。

2.MySQL中的索引

1. MySQL的索引、特点
2. B+Tree和B-Tree的区别
3. Hash索引
4. 索引的具体类型

2.1 聚簇索引和非聚簇索引的区别?

在MySQL中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种主要的索引类型,它们在数据存储和检索方面有显著差异。

  1. 聚簇索引(Clustered Index)

    定义和特点

    • 定义:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。
    • 特点
      • 必须有,而且只有一个
      • 数据行按照聚簇索引的键值顺序存储。
      • 聚簇索引的叶子节点包含实际数据行。
      • 通过聚簇索引进行查询时,数据检索速度较快,因为不需要再次查找实际数据。
      • 插入、更新和删除操作可能比较慢,因为这些操作可能会导致数据行的重新排序和页面拆分。

    在InnoDB存储引擎中,主键默认就是聚簇索引。如果没有定义主键,InnoDB会选择一个唯一的非空索引作为聚簇索引。如果没有这样的索引,InnoDB会自动创建一个隐含的主键作为聚簇索引。

  2. 非聚簇索引(Non-Clustered Index)

    定义和特点:

    • 定义:将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键。
    • 特点
      • 可以存在多个
      • 索引的叶子节点不包含实际数据行,而是包含指向数据行的指针(如主键值)。
      • 非聚簇索引可以加快特定列上的查询速度,尤其是在这些列上进行过滤和排序时。
      • 查询非聚簇索引后需要额外的步骤查找实际数据行,这可能会影响性能。
      • 插入、更新和删除操作对非聚簇索引的影响较小,因为这些操作不会导致数据行的重新排序。

    可以在任意列上创建非聚簇索引,以提高查询性能。

  3. 聚集索引和二级索引的具体结构如下:
    在这里插入图片描述
    回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取数据的方式,就称之为回表查询。

  4. 比较和应用场景

    • 聚簇索引

      • 优点:查询速度快,因为数据行按索引顺序存储,适用于范围查询。
      • 缺点:插入、更新和删除操作较慢,尤其是在数据量大时。
      • 适用场景:需要频繁进行范围查询和排序的场景,例如按日期范围查询订单。
    • 非聚簇索引

      • 优点:可以在多个列上创建,提高特定查询的性能。
      • 缺点:查询需要额外的步骤查找实际数据行,可能会导致查询速度较慢。
      • 适用场景:需要频繁在非主键列上进行查询、过滤和排序的场景。

选择适当的索引类型和设计合理的索引结构,可以显著提高MySQL数据库的查询性能和整体效率。

5. 根据索引的存储形式可以分为?
6. 索引设计原则

  • 针对于数据量较大,且查询比较频繁的表建立索引。
  • 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索 引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间, 避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增 删改的效率。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含 NULL值时,它可以更好地确定哪个索引最有效地用于查询。

3.MySQL中InnoDB和MyISAM的区别?

  • InnoDB引擎, 支持事务, 而MyISAM不支持。
  • InnoDB引擎, 支持行锁和表锁, 而MyISAM仅支持表锁, 不支持行锁。
  • InnoDB引擎, 支持外键, 而MyISAM是不支持的。

4.介绍一下事务的四大特性?

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立 环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。 上述就是事务的四大特性,简称ACID。

5.并发事务引发的问题

  • 赃读:一个事务读到另外一个事务还没有提交的数据。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据 已经存在,好像出现了 “幻影”。

6.事务的隔离级别

在这里插入图片描述
注意:事务隔离级别越高,数据越安全,但是性能越低。

7. having与where不同点 *

  • WHERE 用于过滤表中的行,在分组之前进行过滤。
  • HAVING 用于过滤分组后的结果集,在分组之后进行过滤,通常用于聚合函数。

8. on与where的区别?

  • ON 子句 用于指定表连接的条件,决定如何将两个表的行匹配在一起。
  • WHERE 子句 用于对查询结果进行过滤,进一步筛选符合条件的行。
  • 执行时机:ON 子句在表连接时执行,WHERE 子句在连接操作完成后执行。

9. join、left join、right join的区别?*

  • 内连接:相当于查询A、B交集部分数据
  • 左外连接:查询左表所有数据,以及两张表交集部分数据
  • 右外连接:查询右表所有数据,以及两张表交集部分数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值