面试 - MySQL数据库
基础
-
必须会基本命令操作
-
CRUD
及变形必须熟练运用CRUD
= 增Create、查Retrieve、改Update、删Delete
引擎
-
MySQL有哪几种常见存储引擎
-
InnoDB存储引擎(默认的MySQL引擎):支持事务安全表(ACID),支持行锁定和外键
-
MyISAM存储引擎:插入、查询速度较快,但不支持事物
-
MEMORY存储引擎:将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
-
-
存储引擎的选择/MyISAM索引与InnoDB索引的区别等
事务
-
数据库事务
-
事务:是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
-
eg:A给B转账100元,那么这个操作会涉及到两个关键操作就是:A余额减少100元,B余额增加100元。如果操作过程中突然出现问题比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。所以事务就是保证这两个关键操作要么都成功,要么都要失败。
-
-
ACID 原则是什么?(关系性数据库需要遵循ACID规则。如下四个)
-
原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用
-
一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
-
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
-
持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
-
-
什么是脏读?幻读?不可重复读?/如果不考虑隔离性会引发什么问题(引发脏读、幻读、不可重复读)
-
脏读:其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了X,但是还未来得及提交。然而此时事务A读取了X,而事务B却回滚(程序更新失败返回上一次正确状态的行为)了,这样事务A就形成了脏读。当前事务读到的数据是别的事务想要修改的没有修改成功的数据。
-
不可重复读:事务A首先读取了一条数据X,但是后来事务B在执行的时候改变了数据X,然后事务A再次读的时候发现数据不匹配了。当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配。
-
幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。也就是说,当前事务读第一次取到的数据比后来读取到数据条目不一致。
-
-
上面这些读的问题如何解决?(可以通过设置 事务隔离级别 来解决读的问题)
-
读未提交:最低级别,上述情况都不能避免
-
读已提交:可避免 脏读 发生。Oracle默认隔离级别
-
可重复读:可避免 脏读、不可重复读 发生。Mysql默认隔离级别
-
串行化:可避免脏读、不可重复读、虚读发生
-
锁
-
隔离级别与锁的关系?
-
MySQL都有哪些锁?https://blog.csdn.net/Dhaihaihai/article/details/110454553
-
大概分三类:全局锁、表级锁、行级锁。https://www.sevenyuan.cn/2018/09/01/MySQL锁机制/
-
排它锁和共享锁。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。https://www.yisu.com/zixun/116816.html
-
-
什么是死锁?怎么解决?
视图
- 存储过程与函数
底层原理
-
一条 SQL 查询语句是如何执行的?
-
一条 SQL 更新语句是如何执行的?
-
MySQL底层数据结构是什么?优缺点?