其他数据库

数据库面试题

面试题

  1. 什么时候使用索引查数据比全表扫描还更慢?

 

 

解答

  1. B+树和B树的区别?为什么MySQL要使用B+索引?为什么不用二叉树?
    1. B树又称平衡多路二叉树
    2. 区别?-- B+树非叶子节点不保存数据,只在叶子节点保存数据;B树在叶子节点和非叶子节点都保存数据;从而导致如果使用B树,会增加磁盘IO次数,导致性能不如B+树;
  1. delete、truncate、drop之间的区别?
    1. 表和索引所占的空间。truncate之后table和index会所占用的空间会恢复到初始大小;delete不会减少table和index所占用的空间。
    2. 操作对象不同。truncate只能操作table;delete可以操作table和view。
    3. 效率。truncate>delete。
    4. delete是DML,会放到rollback segment日志中,事务提交才生效;truncate、drop是DDL,立即生效;
    5. 总结:如果想删除表,用drop;如果想删除部分数据,用delete;如果删除全部数据,但是保留表结构,用truncate;

               image.png

  1. 什么是视图?view的使用场景是什么?
    1. 场景
      1. 只暴露几个字段;
      2. 查询的数据来自不同的分表,以联合的结果返回显示;
  1. 【索引面试题组】
    1. 索引的分类
      1. 普通索引
      2. 唯一性索引 --//索引值必须唯一,但允许有NULL值;create unique index idx on table_name(column(length))
      3. 主键索引 -- //一个表只能有一个主键索引,不允许有空值
      4. 复合索引(又叫组合索引)--//遵循最左前缀匹配原则;
      5. 聚簇索引、非聚簇索引 --// 聚簇索引的顺序就是数据物理存储的顺序;
      6. 全文索引
      7. 哈希索引

http://www.cnblogs.com/luyucheng/p/6289714.html

    1. 索引的实现原理?
      1. B+树。-- B+树相对于B树的最大区别在于:B+树增加了叶子节点之间的连接。
    1. 使用索引效率一定高吗?什么场景使用索引?索引在什么场景下失效?MYSQL的索引支持?
      1. 索引缺点:索引虽然能大大提供查询速度,但同时会降低更新速度;
      2. 使用场景
        1. 经常被查询,很少被更新的字段;
        2. 范围查询、排序、分组等特性下;
      1. 失效场景image.png
      2. MYSQL的索引支持? image.png
        1. MYSQL主要提供索引:BTree索引、Hash索引FullText索引、RTree索引
          1. 面试:索引的数据结构有哪些?
        1. 主要差别:
          1. B+树索引具有范围查找和前缀查找能力,查询复杂度为O(NlogN),相当于二分查找;
          2. Hash索引只能做等值查找,但是无论多大的Hash表,查找复杂度都是O(1);
          3. 在MYSQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引,InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。
          4. 在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。
    1. 为什么说B+树比B树更适合文件系统中的文件索引和数据库索引?
      1. //TODO https://blog.csdn.net/v_july_v/article/details/6530142
      2. B+树方便扫库。B+树直接遍历叶子节点就可以了,而B树需要中序遍历扫库。
      3. B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。
    1. InnoDB和MyISAM的索引实现有什么区别?--https://www.cnblogs.com/zlcxbb/p/5757245.html
      1. 主索引的区别。InnoDB数据文件本身就是索引文件;而MyISAM数据文件和索引文件分开,data节点存放的是数据记录的地址
      2. 辅助索引的区别。
    1. 复合索引有中间字段漏了,索引能用上吗?最左匹配原则是怎么实现的?
    2. MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
  1. 什么是存储过程?存储过程有哪些优缺点?
  2. SQL优化有哪些方法?

https://blog.csdn.net/wuseyukui/article/details/71512793

  1. 如何优化一个慢查询?
  2. 说一说三个范式?
    1. 1NF 属性不可再分。
    2. 2NF 属性完全依赖于主键。[消除部分依赖]
    3. 3NF 属性不依赖于其他非主属性。[消除传递依赖]
    4. BCNF 在1NF上,任何非主属性不能对主键子集依赖[在3NF上消除对主码子集的依赖]
    5. 4NF 要求把同一表内的多对多关系删除。[消除多值依赖]
    6. 5NF [消除连接依赖]
  1. having和where的区别?

where是group by 之前的条件,having是where之后的条件。

  1. 【事务面试题组
    1. 事务的特性和隔离级别有哪些?
      1. 原子性A
      2. 一致性C
      3. 隔离性I
      4. 持久性D
    1. Mysql实现事务的原理(MVCC)?
      1. InnoDB采用MVCC来支持高并发,并且实现了4个标准的隔离级别
      2. image.png
    1. 脏读、幻读、不可重复读的区别?

SQL标准制定的隔离级别

 

隔离级别

隔离级别的值

会导致的问题

|

|

|

\|/

读未提交

0

导致脏读

读已提交

1

避免脏读,允许不可重复读和幻读

可重复读(默认)

2

避免脏读和不可重复读,允许幻读

串行化

3

事务串行执行,执行效率慢。

  1. 在MySQL中默认使用可重复读;select @@global.tx_isolation;
  2. 事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发的性能影响也越大;

 

注意:

SQL标准下的RR是允许幻读的,但是InnoDB使用了间隙锁解决了幻读问题,保证事务的隔离级别,达到串行化的要求。

 

类型

理解

详解

脏读

读到了未提交的数据

一个事务读取了另一个事务`未提交的数据`,而这个数据有可能被回滚。

幻读

幻读强调的是新增、删除。同样的条件,两次查询的记录数不同。

 

强调的是:一个事务读到另一个事务已提交的 insert 数据。

不同事务独立执行时发生的一种现象。事务1读取指定Where条件的结果集,然后事务2插入一条新数据,而这条新数据刚好满足事务1所查询的条件,然后事务1再次查询时,看到了事务2新提交的数据。

不可重复读

不可重复读强调的是修改。同样的条件,两次查询的记录值不同

在一个事务范围内,两次查询得到不同的结果。
  1. MyISAM和InnoDB的主要区别和应用场景?

 

InnoDB

MyISAM

事务

支持

不支持

行锁

(只有通过索引条件检索数据才使用行锁,否则使用表锁)

表锁

外键

支持

不支持

MVCC多版本并发控制

支持

不支持

全文索引

不支持

支持

  1. 慢查询 
  2. 乐观锁、悲观锁;mysql的乐观锁、悲观锁是怎么实现的?使用场景?

 

悲观锁

乐观锁

概念

 

适用多读的场景

实现方式

加锁(select...for update)

  1. 版本号机制
  2. CAS

使用场景

Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

缺点

 

  1. ABA问题
  2. CPU开销大
  3. 不能避免脏读

https://blog.csdn.net/qq_34337272/article/details/81072874

  1. select...for update导致死锁
    1. mysql#innodb虽然是支持行锁,但是内部其实走的是锁索引。
    2. 比如,只有主键,则锁主键索引,只有非主键索引,则锁非主键索引。如果都有,内部按顺序走。
  1. 数据库的锁
    1. 类型
      1. 表锁
      2. 行锁
      3. 页锁
      4. 乐观锁
      5. 悲观锁
      6. 共享锁
      7. 排他锁
      8. 意向锁
      9. 记录锁
      10. 间隙锁

https://www.cnblogs.com/paul8339/p/9936005.html

image.png

    1. 什么情况下使用表锁?InnoDB在什么时候使用表锁,什么时候又使用行锁呢?
      1. 在MySQL中,Innodb的行锁使用情况为:只有通过索引条件检索数据才使用行锁,否则使用表锁;
    1. 锁升级
    2. 什么样的场景会产生死锁?如何解决
      1. MyISAM是不会产生死锁的,因为MyISAM要么获取整张表,要么不锁;
      2. 如何产生:在MySQL中,行级锁不是锁记录,而是锁索引
        1. 当2个事务同时执行的时候,一个锁住了主键索引,等待其他相关索引。而另一个锁住了非主键索引,在等待主键索引,这个时候就会产生死锁。
        2. 在发生死锁之后,InnoDB一般会检测到,并使一个事务释放锁,并回退,另一个获取锁完成事务。
      1. 如何避免
        1. 同一个事务中尽量做到获取所需的所有资源,减少死锁产生概率;
        2. 对于非常容易产生死锁的业务,可以考虑升级锁的粒度,通过表级锁来降低死锁的概率;
        3. 以固定的顺序访问表和行。交叉访问更容易造成事务等待回路。
        4. 降低隔离级别。如果业务允许(上面也分析了,某些业务并不能允许),将隔离级别调低也是较好的选择,比如将隔离级别从 RR 调整为 RC,可以避免掉很多因为 gap 锁造成的死锁。
        5. 为表添加合理的索引。防止没有索引出现表锁,出现死锁的概率会突增。
    1. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
    2. MySQL 表锁和行锁机制
  1. 分库分表的原则?分库分表之后会带来什么问题?--见16.c
  2. MYSQL大表优化方案
    1. 单表优化:
      1. SQL调优加索引;
      2. 数据库参数调优;
      3. 升级硬件;
    1. 读写分离;
    2. 分库分表:垂直拆分、水平拆分。--优缺点?
    3. 表分区;
    4. 对于非结构化的数据,对事物要求不高,可以使用NOSQL;
  1. SQL注入原理?如何预防?
  2. 说一下MVCC机制?原理是什么?
  3. MySQL主从复制怎么实现的?具体原理是什么?有什么优缺点?如何解决主从同步延时问题?image.png
    1. 原理:同步bin-log日志(记录了所有sql操作)
      1. 主:binlog输出线程
      2. 从:IO线程-去主库请求binlog,并将得到的binlog写到relay log(中继)日志文件中;
      3. 从:SQL线程-读取relay log日志读取、解析、执行,从而实现主从一致。
    1. 如何解决主从同步延时问题?
      1. 并行复制
    1. 做主从之后,主挂了怎么办?
      1. 半同步复制
  1. 什么时候使用索引查数据比全表扫描还更慢?
  2. 聚簇索引和非聚簇索引的区别?
    1. 聚簇索引
      1. 索引文件和数据文件在同一文件中。聚簇索引主要用在InnoDB引擎中。
    1. 非聚簇索引
      1. 非聚簇索引指的是B+树叶子节点上的data,并不是数据本身,而是数据存放的地址。主要用在MyISAM引擎中。
      2. 非聚簇索引比聚簇索引多一次数据IO。

image.png

 

参考链接

  1. https://zhuanlan.zhihu.com/p/23713529?refer=passer
  2. 《MySQL实战45讲》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值