面试题-数据库篇

数据库在面试中可能会遇到的问题

数据库篇

数据库的三范式是什么

关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

  • 第一范式(1NF):(所有关系型数据库的最基本要求)无重复的列。
  • 第二范式(2NF):在第一范式的基础上建立起来的。要求实体的属性完全依赖于主关键字。
  • 第三范式(3NF):必须先满足第二范式,属性不依赖于其它非主属性
  • BCNF

一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几

存储引擎是MyISAM(MySQL5.1之前默认)的话,id为8。存储引擎是InnoDB(MySQL5.5之后默认),id为6。(InnoDB把自增主键的最大id值记录在内存中,重启会导致id值丢失)

注: MySQL中的数据是用各种不同的技术存储在文件(或者内存)中的。数据库管理系统适用数据引擎进行创建、查询、更新、删除数据操作。不同的存储引擎使用不同的存储机制索引技巧锁定水平等功能。不同的存储引擎有其特定的功能和适用领域。

如何获取当前数据库版本

//打开cmd,输入mysql --version
> mysql --version
MYSQL  Ver 8.0.15 for Win64 on x86_64 (MySQL Community Server - GPL)

说一下 ACID 是什么

ACID指数据库事务正确执行的四个基本要素的缩写。这四要素分别为:

  • 原子性(Atomicity):要么全做,要么都不做
  • 一致性(Consistency):
  • 隔离性(Isolation):
  • 持久性(Durability):将数据写到磁盘上,进行存储

支持事务(Transaction)的数据库,必须要具有这四种特性,否则无法保证数据的正确性

注: 暂时没有找到通俗易懂的解释,之前记得的

char 和 varchar 的区别是什么

char是定长的,而varchar非定长,char(n) 将意味着不论数据是否达到n个字节,都要占去n个字节的空间,而varchar(n)存储不大于n个字节的数据,实际存储大小为输入数据的大小

float 和 double 的区别是什么

float是单精度浮点数,当数据在一定范围内时(没有double范围大),float数据是正确的,超过特定范围可能引起数据不稳定问题。在没有对相关数据进行限定处理时建议先设置为double或decimal,保证数据的准确。

关于浮点数相关标准:IEEE 754

注: 暂时没又找到这个标准的链接

mysql 的内左右连接有什么区别

MySQL中的内连接数据记录中不存在字段为null的情况,即显示两个表中有联系的所有数据(左连接or右连接结果去除字段为null的结果);左连接,以左表为参照,显示所有数据;右连接,以右表为参照显示所有数据。

mysql 索引是怎么实现的

MySQL支持多种存储引擎,而存储引擎对索引得支持各不相同。因此MySQL数据库支持多种索引类型,如:BTree索引、哈希索引、全文索引等等,平时主要使用得为BTree索引。

索引是一种数据结构(索引是帮助MySQL高效获取数据的数据结构)


常见的实现索引类型:B树索引和哈希索引,

B树索引

  • 默认的索引实现,使用B+树数据结构存储
  • 索引列顺序存储,便于范围查找

哈希索引

  • 使用哈希表来实现
    • key 是索引列的哈希值
    • value是只想对应行的指针
  • 局限性
    • 必须索引列全值匹配
    • 不适用排序,索引数据不是顺序存储
    • hash冲突的代价

MySQL索引背后的数据结构及算法原理

怎么验证 mysql 的索引是否满足需求

说一下数据库的事务隔离

说一下 mysql 常用的引擎

  1. InnoDB引擎(支持事务处理)
  2. MyIASM引擎(不支持事务处理)

两种搜索引擎使用的索引数据结构都是B+树。前者的索引模式被称为聚集索引,后者的索引模式被称为非聚集索引

说一下 mysql 的行锁和表锁

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表

行锁,行级锁(row lock)可以最大程度的支持并发处理(同时也带来了最大的锁开销)。InnoDB和XtraDB等一些存储引擎实现了行级锁。行级锁只在存储引擎层实现,服务层并没有实现。

说一下乐观锁和悲观锁

mysql 问题排查都有哪些手段

  • show processlist 列出当前MySQL数据库运行的所有线程
  • innodb_trx:当前运行的所有事务
  • innodb_locks:当前出现的锁
  • innodb_lock_waits:锁等待的对应关系
  • show open tables where in_use > 0;:当前打开表
  • show engine innodb status \G; Innodb状态
  • show status like ‘innodb_row_lock_%’; 锁性能状态
  • explain+[SQL语句];查询优化器

如何做 mysql 的性能优化

合理安排资源、调整系统参数可对MySql性能进行一定的优化,要从多方面考虑:查询、更新、服务器等
,原则上就是减少系统瓶颈,减少资源占用,增加系统的反应速度


红色字体代表未完全完成