当前位置:   article > 正文

Java面试题总结(四)-mysql篇、redis篇

Java面试题总结(四)-mysql篇、redis篇

一.mysql篇

1.什么是关系型数据库,什么是非关系型数据库

  • 关系型数据库是依据关系模型来创建的数据库(就是我们常说的一对一 一对多 多对多)
  • 非关系型数据库主要是基于“非关系模型”的数据库,是一种数据结构化存储方法的集合,可以是文档或者键值对等

2.为什么要使用索引

  • 通过索引可以大幅度提升查询速度(翻字典的例子)

3.什么样的信息能成为索引

  • 能把记录限定到一定查找范围的字段 如主键、唯一键、普通键都可以

4.索引的数据结构

  • 通常是B+树
  • 小众有hash结构和bitmap等

5.mysql常见的两种引擎,有什么区别

  • myISAM和InnoDB
  • MyISAM:不支持事务,也不支持外键,表级锁(锁住整张表),大量的select和insert比较适合
  • InnoDB:mysql默认引擎,支持事务,支持外键,行级锁,大量的update和insert比较适合

6.索引是建立越多越好嘛

  • 物极必反
  • 数据量小的表不需要建立索引(就像读两页的书,谁会去看目录)
  • 索引过多就要更多的空间(一本100页的书有50页的目录,你愿意去看?)

7.varchar和char区别,varchar(50)中50的含义

  • char是一种固定长度的类型,varchar是一种可变长度的类型
  • varchar(50)中50表示最多存放50个字符

8.事务是什么

  • 作为一个整体一起向系统提交,要么都执行、要么都不执行

9.事务的特性

  • 原子性:一个事务作为一个整体,要么全完成、要么全部不完成
  • 一致性:事务前后数据的完整性必须保持一致
  • 隔离性:一个事务的执行不能其它事务干扰,并发执行的各个事务之间不能互相干扰
  • 持久性:一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的

10.Statement和PreparedStatement区别

  • 后者接口代表预编译语句,减少SQL编译错误和增加SQL安全性
  • 当批量处理SQL或频繁执行相同的查询时,后者有明显优势,后者是将编译优化后的SQL语句缓存起来,下次执行相同结构的语句就会很快
  • 并且后者还防止SQL注入,更安全

11.数据库的乐观锁和悲观锁是什么

  • 悲观锁:认为自己读数据的时候,别人可能刚好在写自己刚读的数据,为了解决这个问题,只有对自己读取的数据加锁,等自己把数据读完,才允许别人修改自己读取的数据
  • 乐观锁:认为一个用户读数据的时候,别人不会去写自己所读的数据,只在提交操作时检查是否违反数据完整性

12.事务隔离级别

在这里插入图片描述

13.为什么不直接设成最高隔离级别

  • 出于性能考虑,事务隔离级别越高,安全性越高,串行化执行越严重,降低数据库并发度
  • mysql默认是可重复度,Oracle默认是已提交读

14.更新丢失、脏读、不可重复读、幻读

  • 更新丢失
    在这里插入图片描述
  • 脏读:一个事务读到另一个事务未提交的更新数据
    在这里插入图片描述
  • 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据结果不一致;取出数据不可靠,万一那个人还在操作呢
    在这里插入图片描述
  • 幻读:事务A去读取与搜索条件相匹配的若干行,事务B以插入或删除行等方式修改事务A的结果集导致事务A看上去是出现了幻觉一样
    在这里插入图片描述

15.左连接和右连接区别

  • 在说这个之前我们先回顾下多表查询
  • 表连接的几种方式:内连接、外连接、自连接、全连接
  • 下面我举个例子
  • 学校表
    在这里插入图片描述
  • 学生表
    在这里插入图片描述
  • 学校和学生的关系是一对多,通常把一的主键的主键作为多的外键,所以学生表中的collegeId为外键
  • 内连接
    在这里插入图片描述
SELECT 列名1,列名2... FROM 表1 INNER JOIN 表2 ON 表1.外键=2.主键 WhERE 条件语句;
  • 1

在这里插入图片描述

  • 左外连接
    在这里插入图片描述
SELECT 列名1 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.外键=2.主键 WhERE 条件语句;
  • 1

在这里插入图片描述

  • 右外连接
    在这里插入图片描述
SELECT 列名1 FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.外键=2.主键 WhERE 条件语句;
  • 1

在这里插入图片描述

  • 全连接(union和union all区别)
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

16.优化sql

  • 选择正确的数据库存储引擎
  • 当只有一行数据时用limit 1
  • 对操作符优化,尽量不采用不利于索引的操作符,如:in、not in、is null、is not null等
  • 避免在where子句中对字段进行null判断,否则将导致引擎放弃使用索引而进行全表扫描
  • limit基数过大时用between
  • 尽量避免在列上做运算,这样会导致索引失效

17.说说你想到的表结构优化

  • 根据表的特点选择正确的存储引擎
  • 永远为每张表设置一个ID
  • 使用可存下数据最小的数据类型
  • 尽量少用text
  • 给频繁使用和查询字段建立合适的索引

18.说下除增删改查其他mysql中常用命令

  • show variables 显示变量
  • set xxx 设置变量值
  • explain sql语句 分析sql语句

19.索引分类

  • 普通索引:最基本的索引,没有任何限制
  • 唯一索引:索引列值必须唯一,允许有空值
  • 主键索引:特殊唯一索引,一个表只能有一个主键,不允许空值
  • 全文索引:用来查找文本中的关键字,而不是直接与索引中的值相比较(MyISAM支持 InnoDB不支持)

20.什么是外键

  • 外键指的是外键约束 保持数据一致性、完整性,控制存储在外键表中的数据,让两张表形成关联

21.说下b树和b+树

  • 说b树前先说说为什么二叉树、红黑树、hash下最后大众索引都用的b树
  • 因为二叉树读取数据比全文检索优化了点,但是二叉树存在着不平衡的可能
    在这里插入图片描述
  • 相比二叉树,红黑树会把插入的数据进行平衡处理,就不会出现单边增长的情况。但是呢,一旦数据量庞大了,红黑树就存在着深度会很深的情况,也就是深度不可控,这样查数据也会很耗时
    在这里插入图片描述
  • 再来看看hash,比起红黑树,hash可以固定"深度",但是hash不能做范围查找,所以大众索引没有采用hash结构
  • B树就在红黑树的基础上,每个节点存放多个数据(扩大横向深度,减少纵向深度)
    在这里插入图片描述
  • B+树,B树的变种,B树存放数据是这样子的,会在每个对应的索引列的值上存放上对应的数据
    在这里插入图片描述
    而B+树不同,它只会在叶子节点上挂载数据,非叶子节点不会存放数据,数据只会存在叶子节点上面,非叶子节点只存放索引列的数据。并且叶子节点间会有指针,数据又是递增的,这使得我们范围查找可以通过指针连接查找,而不再从上面节点往下一个个找

在这里插入图片描述

22.mysql如何实现主从同步

  • 首先说说主从同步的概念
  • 多态数据服务器中,只有一台主服务器,而主服务器只负责写入数据,不负责外部程序读取数据。存在多台从服务器,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。应用程序可以随机读取某一台从服务器的数据,这样就可以分摊读取数据的压力。当从服务器不能工作时,整个系统将不受影响;当主服务器不能工作时,可以方便地从从服务器选举一台来当主服务器。
  • 主数据库进行增删改操作后,相应操作记录的语句会记录到binlog日志文件中(binlog日志文件一般和数据库data文件夹在一起)
  • 从数据库会请求主数据库的binlog日志文件,获取到新的操作语句,然后在自己的从数据库上自动执行相同的操作语句,进而实现主从的同步

二.redis篇

1.什么是redis

  • 本质上是一个key-value类型的内存数据库
  • 关系数据库数据存在磁盘中,而非关系数据库数据存在内存中

2.redis特点

  • 数据类型丰富
  • 支持数据磁盘持久化存储
  • 支持主从同步
  • 支持分片(3.0以后支持)
  • redis单个操作都是原子性的,让我们不用考虑并发的问题

3.为什么redis能这么快(每秒查询速度10W+)

  • 完全基于内存,绝大部分请求是纯粹的内存操作,读写数据不受硬盘IO限制
  • 数据结构简单
  • 使用多路I/O复用模型,非阻塞IO

4.redis的数据类型

  • 五大基本类型
    • String:二进制安全(可以包含任何数据 JPG图片或者序列化的对象) KV键值对
    • Hash:String元素组成的字典,适合用于存对象(是一个String类型的field和value映射表)
    • list:列表,按照String元素插入顺序排序,后进先出(栈)
    • set:String元素组成的无序集合,通过哈希表实现,不允许重复(添加查找删除时间复杂度都为O(1))
    • sorted set:通过分数来为集合中的成员进行从小到大的排序(也是string类型的集合,不允许重复成员,每个元素都会关联一个double类型的分数,分数可以重复,可以存储成绩-学号,天然排序)
  • 三大高级数据类型
    • Bitmap:存储与对象ID关联的节省空间并且高性能的布尔信息
    • Geo:用于支持存储地理位置信息
    • HyperLogLog:用于计数

5.redis如何持久化

  • 一旦服务器进程退出,服务器的数据就会丢失
  • redis主要提供了两种持久化的方案将内存中的数据保存到磁盘中避免数据丢失
  • RDB(快照)持久化:保存某个时间点的全量数据快照 ,redis会定期将里面的全量数据保存生成dump.rdb文件(定期规则在redis.conf配置文件设置)
  • AOF持久化:保存写状态,记录除查询外所有变更数据库状态的指令(默认AOF持久化时关闭的,还是在redis.conf配置)
  • 还有种就是混合,两种都使用

6.从海量数据查询某一固定前缀

  • keys pattern:查找所有符合给定模式pattern的key,但是一旦数据量大就会导致客户端卡住,对内存消耗和redis服务器都是一个隐患
  • 只返回部分数据scan 0 match k1* count 10
  • 获取的值不定,所以要去重,分批次遍历…所以scan指令花费时间比keys要长
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/160273
推荐阅读
相关标签
  

闽ICP备14008679号