数据库常见面试题

1.什么是存储过程?有哪些优缺点?

存储过程相当于编程语言中的函数,封装了我们的代码

存储过程的优点:

  • 封装代码
  • 保存在数据库中
  • 让编程语言调用
  • 存储过程是预编译代码块,执行效率高
  • 存储过程代替大量的sql语句,降低网络通信量,提高通信效率

存储过程的缺点:

  • 每个数据库的存储过程语法不一样,不通用
  • 业务逻辑放在数据库上,难易迭代

2.数据库范式你了解哪些?

第一范式:属性的原子性,列不可再分。(第一范式是所有关系型数据库的基础,不满足第一范式的数据库就不是关系型数据库)

第二范式:每个属性都必须完全依赖全部主键,不允许部分依赖

第三范式:每个非主属性都不传递依赖于R的候选码,不允许传递依赖

BC范式:每个属性都不传递依赖于R的候选码

3.数据库索引

什么是索引?

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询,更新数据库表中的数据

(可以这样理解,索引是加快检索表中数据的方法,索引就像字典的目录,有了这个目录你就可以快速找到某页你想要的东西)

底层的数据结构是什么?

B+树

使用这种数据结构使得查找效率高,速度快

索引的分类

  • 普通索引:key
  • 主键索引:primary  key,主键的值非空且唯一
  • 唯一索引:unique  key,不允许俩行具有相同的索引值
  • 全文索引:fulltext  key

优点:

  1. 加快数据检索速度
  2. 加快表与表之间的连接
  3. 通过创建唯一性索引,可以保证数据库中每一行数据的唯一性

缺点:

  1. 索引需要占据物理空间
  2. 创建和维护索引耗费时间

4.听说过事务吗?

 事务是数据库执行的最小单位,一个事务的执行要么都成功,要么都失败。

事务满足以下四大特征:

  1. 原子性:事务作为整体被执行,要么都成功,要么都失败
  2. 一致性:事务的执行保证数据库从一个一致的状态转变为另一个一致的状态
  3. 隔离性:多个事务并发执行时,一个事务的执行不应该影响其他事务的执行
  4. 持久性:事务一旦提交,对数据库的修改应该是永久保存的

事务的并发问题有哪些?  

丢失更新:一个事务的更新覆盖了另一个事务的更新

脏读:一个事务读取了另一个没提交的事务数据(select)

不可重复读:在同一个事务中对同一个数据俩次读取结果不一致,主要针对修改,被读取的数据被其他事务修改了(update)

幻读:主要针对新增和删除,同样条件下俩次读出来的记录数不一样(insert   delete)

事务的隔离级别有哪几种?

读未提交:允许一个事务读取另一个事务还未提交的数据

读已提交:在一个事务中,只允许对其他事务已经提交的记录可见(能避免脏读)

可重复读:其他事务对数据库的修改在本事务中不可见,增加和删除对本事务可见(能避免脏读、不可重复读)***MySQL默认隔离级别

序列化:允许事务串行执行,(都能避免、但开销大、性能极差)

5.什么是视图,视图的使用场景有哪些?

视图是一种虚拟的表,可以对数据库进行增、改、查操作。视图中可以包括一个表或多个表的行与列,对视图的操作不影响基本表,它使得我们获取数据更容易。

应用场景:

  1. 不希望访问者获取整个表的信息,只是暴露部分字段给访问者,所以创建一个虚表
  2. 查询数据来源于不同表,查询者希望以统一的方式查询,建立视图可以多表查询,效率也高

6. drop、delete、truncate的区别?

drop是删除表内容及结构、不可回滚、不可带where、删除速度快

delete是删除表中指定行数据、可回滚、可带where、删除速度慢

truncate是删除表中的内容,表结构还保留、不可回滚、不带where、删除速度快

7.触发器的作用?

触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

触发器的这种特性可以协助应用在数据库端确保数据库的完整性

8.varchar和char的区别?

varchar和char都是数据库中用于描述字符串的类型

char是定长的;varchar是不定长的。

比如定义一个char[10]和一个varchar[10],如果存进去的都是‘test’,那么char还是占用10个长度,而varchar就会占用4个长度。所有char适合用于存放定长的字段,varchar适合用于存放不定长的字段。

char的存取速度比varchar要快

9.实践中如何优化MySQL?

MySQL的优化主要分为四部分:sql语句的优化、表结构的优化、系统配置的优化、硬件的优化

(1)sql语句优化

怎么发现有问题的sql?

  1. 通过MySQL慢查询日志对有效率问题的sql进行监控
  2. 通过explain查询和分析sql的执行计划
  3. sql语句的优化:
  • 优化insert,一次插入多值
  • 尽量避免使用*,*会遍历表两次,降低查询效率
  • 用in代替or
  • 尽量避免在where子句中使用!=或<>
  • 尽量避免在where子句中对字段进行null值判断
  • 用连接代替子查询
  • 用exists代替in

(2)数据库表结构优化

  1. 选择合适的数据类型
  2. 表的范式优化
  3. 表的垂直拆分
  4. 表的水平拆分

(3)系统配置的优化

  1. 操作系统配置优化:增加TCP支持的队列数

(4)硬件的优化

  1. CPU:核心数多并且主频高的
  2. 内存:增大内存
  3. 磁盘配置和选择:磁盘性能 

10.sql的执行顺序

写的顺序:select ... from... where.... group by... having... order by.. limit [offset,]

执行顺序:from、where、group by 、having、select、order by、limit

11.#{}与${}的区别

#{}是预编译的、${}是字符串替换

#{}可以防止sql注入

#{}会被替换成?、${}会被替换成变量的值

PS:有一些特殊情况只能使用${},比如 order by ${}、 like ${}

12.mysql的存储引擎

InnoDB是事务性的存储引擎、MyISAM是非事务的

InnoDB是行级锁、MyISAM是表级锁

InnoDB的执行效率没有MyISAM高


借鉴:java3y 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值