数据库SQL常见面试题

1.聚集索引与非聚集索引的区别

(1)一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。

(2)聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

(3)索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

(4)聚集索引:物理存储按照索引排序;非聚集索引:物理存储不按照索引排序;

2.为什么要用B+树,为什么不用普通二叉树?

可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是普通二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?

(1)为什么不是普通二叉树?

如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

(2)为什么不是平衡二叉树?

我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。

(3)为什么不是B树而是B+树?

B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。

B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

3.Hash索引和B+树索引区别是什么?

· B+树可以进行范围查询,Hash索引不能。

· B+树支持联合索引的最左侧原则,Hash索引不支持。

· B+树支持order by排序,Hash索引不支持。

· Hash索引在等值查询上比B+树效率更高。

· B+树使用like进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊查询。

4.什么是最左前缀原则?什么是最左匹配原则?

最左前缀原则,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

当我们创建一个组合索引的时候,如(a1,a2,a3),相当于创建了(a1)、(a1,a2)和(a1,a2,a3)三个索引,这就是最左匹配原则。

5.索引不适合哪些场景?

· 数据量少的不适合加索引

· 更新比较频繁的也不适合加索引=区分度低的字段不适合加索引(如性别)

6.索引有哪些优缺点?

(1)优点:

· 唯一索引可以保证数据库表中每一行的数据的唯一性

· 索引可以加快数据查询速度,减少查询时间

(2)缺点:

· 创建索引和维护索引要耗费时间

· 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间

· 以表中的数据进行增、删、改的时候,索引也要动态的维护

7.悲观锁与乐观锁区别?

(1)悲观锁:

每次拿数据时都认为别人会修改,所以每次那数据时都会上锁,别人拿数据时会阻塞直到拿到锁。

(2)乐观锁:

每次拿数据都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。

实现方式:乐观锁一般会使用版本号机制或CAS算法实现。

MVCC (Multiversion Concurrency Control),即多版本并发控制技术。

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁

8.MySQL事务得四大特性以及实现原理?

· 原子性:事务是最小的执行单位,不允许分割。作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

· 一致性:执行事务后,数据从一个正确的状态转换到另一个正确的状态。

· 隔离性:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。

· 持久性:表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

事务的隔离级别有哪些?MySQL的默认隔离级别是什么?(注意英文)

· 读取未提交(Read Uncommitted)

· 读取已提交(Read Committed)

· 可重复读(Repeatable Read)

· 可串行化(Serializable)

Mysql默认的事务隔离级别是可重复读(Repeatable Read)

9.什么是幻读,脏读,不可重复读?

事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。

在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。

事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

10.InnoDB与MyIsam的区别?

InnoDB 和 MyISAM 是 MySQL 数据库管理系统中最常用的两种存储引擎。它们各自有不同的特性和用途,适合不同的应用场景。

10.1. 事务支持:

  • InnoDB 支持事务(Transaction),具有提交(COMMIT)和回滚(ROLLBACK)的能力,适合需要高可靠性和数据完整性的应用。
  • MyISAM 不支持事务,适合读密集型的应用场景。

10.2. 行级锁与表级锁:

  • InnoDB 支持行级锁(Row-level locking)和外键约束,能够更有效地支持并发访问,减少锁竞争。
  • MyISAM 只支持表级锁(Table-level locking),并发写操作时可能会锁定整个表,影响性能。

10.3. 数据恢复:

  • InnoDB 提供了更加强大的数据恢复能力,通过日志(如事务日志)来实现。
  • MyISAM 在遇到崩溃后的数据恢复方面表现不如 InnoDB。

10.4. 全文索引:

  • MyISAM 早期支持全文索引(Full-text indexing),适合文本搜索应用。但从 MySQL 5.6 版本开始,InnoDB 也支持全文索引。
  • InnoDB 现在也支持全文索引,且随着版本更新,其全文索引的性能和功能都在不断增强。

10.5. 存储限制:

  • InnoDB 文件大小一般受到操作系统文件大小的限制,可以支持较大的数据量。
  • MyISAM 的表大小限制较小,这在一些操作系统上可能成为限制。

11.delete drop的区别?

DELETEDROP 是 SQL 语句中用于删除数据的两个不同命令,它们的作用范围和影响也不同。

DELETE:

  • DELETE 用于删除表中的一行或多行记录,并且可以有条件地选择删除哪些行。
  • 使用 DELETE 删除记录后,表的结构仍然存在,且可以再次插入新的数据。
  • DELETE 操作可以回滚(如果在事务中使用),不会立即释放空间,除非执行了数据库的压缩或清理操作。
  • DELETE 操作相对较慢,因为它逐行删除数据,并且记录日志以便于事务回滚。

DROP:

  • DROP 用于删除整个表或数据库,包括表中的数据和表的结构。
  • 使用 DROP 命令后,表或数据库被完全移除,无法回滚(在非事务性存储引擎中),且相关的空间会被立即释放。
  • DROP 操作执行速度快,因为它不逐行处理数据,而是直接移除整个结构。
  • DROP 除了用于删除表和数据库外,也可以用于删除索引、视图等数据库对象。

简而言之,DELETE 主要用于删除表中的部分或全部数据,而不影响表结构;而 DROP 用于彻底删除表或数据库,包括其结构和数据。

12 连接 (内连接,外连接)

在 SQL 中,连接(JOIN)用于结合两个或多个表中的行。连接主要分为内连接和外连接,每种连接都有其特定用途。

内连接(INNER JOIN):

  • 内连接返回两个表中匹配的行。如果在一个表中的行在另一个表中有对应的行,则这些行会被内连接返回。
  • 如果某行在任一表中没有匹配,则不会返回该行。
  • 内连接可以看作两个表的交集。

外连接(OUTER JOIN):

  • 外连接返回至少包含一个表中的所有行,即使另一个表中没有匹配的行。外连接分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
  • 左外连接(LEFT OUTER JOIN):返回左表的所有行,即使右表中没有匹配的行。如果右表中没有匹配的行,则结果集中右表的部分将为 NULL。
  • 右外连接(RIGHT OUTER JOIN):返回右表的所有行,即使左表中没有匹配的行。如果左表中没有匹配的行,则结果集中左表的部分将为 NULL。
  • 全外连接(FULL OUTER JOIN):返回左表和右表中的所有行。如果某些行在另一表中没有匹配,则那一部分将为 NULL。

13 数据库三大范式

数据库的范式(Normalization)是为了减少数据冗余和提高数据完整性而设计的一组规则。每一级范式都建立在前一级范式的基础上:

第一范式(1NF):

  • 数据表中的所有字段都是不可分割的原子值,确保每列的原子性。
  • 数据表的每一列都是唯一的。

第二范式(2NF):

  • 在第一范式的基础上,所有非主属性完全依赖于主键。即表必须有一个主键,非主属性不能依赖于主键的一部分(对于复合主键而言)。
  • 解决了部分依赖问题。

第三范式(3NF):

  • 在第二范式的基础上,非主属性不依赖于其他非主属性,即消除了传递依赖。
  • 一个表中没有任何属性依赖于其他非主键的属性。

范式化的目标是减少数据冗余,避免数据异常,提高数据的逻辑一致性。然而,过度范式化可能会导致查询性能下降,因为可能需要更多的表连接操作。在实际应用中,设计数据库时需要在范式化和性能之间做出平衡。

以及数据库的查询等等的语句,建议多刷题!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值