【不失业计划】面试中我遇到的那些数据库题目


(星号表示遇到的频率)

1、事务
1.1 事务的特性(****)
  • 原子性

    事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性

    事务开始之前和之后,数据库的完整性约束没有被破坏,数据库事务不能破坏关系数据的完整性以及逻辑的一致性。

  • 隔离性

    多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果。在并发环境中,当不同事务同时操纵相同的数据时,每个事务都有各自的完整空间。

  • 持久性

    事务完成以后,该事务对数据所做的更改便会持久的保存在数据库之中。

1.2 隔离级别
1.2.1 并发引起的问题(***)
  • 丢失修改

    两个事务t1,t2读入统一数据并修改,t2的提交被t1的修改破坏了。

  • 不可重复读

    t1读取数据后,t2执行更新操作,t1无法再读取结果。(通过“读锁”和“写锁”解决不可重复读,读取数据的事务将会禁止写事务(允许读),但写的时候,禁止其他任何操作)。

  • 脏读

    t1修改了某个数据并写回磁盘,t2读取同一数据,但t1撤销了,此时t2与t1中的数据不一样。

  • 幻读

    两次查询操作中查到的数据不一致(在查询之间有另一事务的插入操作)。

1.2.2 事务的隔离级别(*****)
  • 未提交读

    最低的隔离级别。允许脏读,但不允许更新丢失,事务可以看到其他事务尚未提交的修改。

  • 提交读

    允许不可重复读,但不允许脏读取,可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问改行数据,但是未提交的写事务将会禁止其他事务访问。

  • 可重复读

    禁止不可重复读,但有时会出现幻读数据。可以通过“共享读锁”和“排他写锁“实现。读取数据的事务将会禁止写事务(允许读),写事务禁止其他任何事务。

  • 可序列化

    最高的隔离级别,要求事务序列化执行,事务只能一个接一个执行,并不能并发执行。必须通过一些机制,保证新插入的数据不会被刚执行查询操作的事务访问到。

事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发的的影响也越大。

2、常见的存储引擎及特性(***)
2.1 InnoDB(*****)
  • InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
  • 特性
    • 为MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
    • InnoDB锁定在行级并且也在 SELECT语句中提供一个类似Oracle的非锁定读,这些功能增加了多用户部署和性能。
    • 可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合。
    • 对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。
    • MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
2.2 MyISAM
  • MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。

  • 特性

    • 被大文件系统和操作系统支持。
    • 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成。
    • NULL被允许在索引的列中,这个值占每个键的0~1个字节。
2.3 MEMORY
  • MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
  • 特性
    • MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度。
    • 可以在一个MEMORY表中有非唯一键值。
    • MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。
2.4 InnoDB和MyISAM的区别

1、MyISAM是非事务安全的,而InnoDB是事务安全的

2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁

3、MyISAM支持全文类型索引,而InnoDB不支持全文索引

4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM

5、MyISAM表保存成文件形式,跨平台使用更加方便

6、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量select操作可选择

7、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,可选择。

3、查询语句(*****)

通常手撕数据库的多表查询,偶尔问一些关键字的使用顺序

  • 查询(关键字)顺序:

    select 
      distinct  <select_list>
            from   <left_table> 
                <join_type> join <right_table> 
                  on <join_condition>
                      where <where_condition>
                           group by <groupby_list>
                                         having  <having_condition>
                                                  order by <orderby_conditoin>
                                                               limit <limit number>
  • leetcode :力扣数据库题目 简单题基本过一遍,会上面的关键字的用法即可。

4、常见索引有哪些(*****)
4.1 聚集索引、非聚集索引(***)
  • 聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

    聚集索引类似于电话簿(或者拼音字典),后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

  • 非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,一个表中可以拥有多个非聚集索引。

    其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。

4.2 普通索引、主键索引、唯一索引、组合索引、全文索引(*****)
  • 普通索引:最基本的索引,没有任何限制
  • 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
  • 主键索引:它是一种特殊的唯一索引,不允许有空值。
  • 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
  • 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
4.3 B+Tree索引、Hash索引(****)
  • B+Tree

    是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.

  • Hash

    hsah索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.当时因为是hash结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.

4.4 索引底层实现原理(包含BTree和B+Tree的区别)(*****)

​ 这里需要图片展示更直观一些(b树就是b-树),找了一个讲的不错的博客: B树和B+树

5、SQL优化有哪些方法(*****)
  • 问题:为什么需要sql优化?怎么使用sql优化?

  • 答:

    • 为了提升查询效率,在sql优化中最重要的是避免全表扫描;(第一问)

    • 适当的创建索引,考虑在 where 及 order by 涉及的列上建立索引(把所建的索引所用列名,用在where语句中,并尽量在条件的最右边(这里开始全是第二问,一般下面你记得几个简单的就可以啦)

    • 尽量避免在 where 子句中对字段进行 null 值判断、使用!=或<>操作符、使用 or 来连接条件、对字段进行函数操作等

    • in 和 not in 也要慎用,否则可能会导致全表扫描

    • 很多时候用 exists 代替 in 是一个好的选择

    • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

    • 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    • 把条件最小的写在最右边,如果id=?写在最右边

    • 尽量少写子查询,用join语句代替,少写in,like,or

    • 更多的具体条目参考这篇写的不错的博客 这里查看

6、简述一下sql的编译过程(***)

大致过程:

  1. 客户端发送查询语句给服务器。
  2. 服务器首先检查缓存中是否存在该查询,若存在,返回缓存中存在的结果。若是不存在就进行下一步。
  3. 服务器进行SQl的解析、语法检测和预处理,再由优化器生成对应的执行计划。
  4. Mysql的执行器根据优化器生成的执行计划执行,调用存储引擎的接口进行查询。
  5. 服务器将查询的结果返回客户端。

具体的参考:sql语句执行过程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值