数据库在面试中可能会遇到的问题
数据库篇
数据库的三范式是什么
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。在任何一个关系数据库中,第一范式(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 常用的引擎
- InnoDB引擎(支持事务处理)
- 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性能进行一定的优化,要从多方面考虑:查询、更新、服务器等
,原则上就是减少系统瓶颈,减少资源占用,增加系统的反应速度
红色字体代表未完全完成