MySQL常见知识点 面试题
2024-01-11 09:52:33 9 举报
AI智能生成
MySQL是一种关系型数据库管理系统,它被广泛用于Web应用程序开发中。以下是一些常见的MySQL知识点面试题: 1. 什么是MySQL? 2. 请列举MySQL的优点和缺点。 3. 什么是SQL注入攻击?如何防止SQL注入攻击? 4. 请解释ACID属性。 5. 请解释事务的四个特性(原子性、一致性、隔离性和持久性)。 6. 请解释索引的概念及其作用。 7. 请解释主键和外键的概念及其作用。 8. 请解释视图的概念及其作用。 9. 请解释存储过程和函数的概念及其作用。 10. 请解释触发器的概念及其作用。
作者其他创作
大纲/内容
MySQL
事务
特性
原子性
一致性
隔离性
持久性
一致性
隔离性
持久性
事务并发存在的问题
脏读(dirty read)
事务A读取到事务B未提交的数据
不可重复读(unrepeatable read)
在事务A范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读
幻读
事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并提交
然后事务A再次查询相同的范围,两次读取得到的结果集不一样
然后事务A再次查询相同的范围,两次读取得到的结果集不一样
隔离级别
读未提交(Read Uncommitted)
一个事务会读到其他事务未提交的数据的,即存在脏读问题
读未提交,采取的是读不加锁原理。
事务读不加锁,不阻塞其他事务的读和写
事务写阻塞其他事务写,但不阻塞其他事务读;
事务读不加锁,不阻塞其他事务的读和写
事务写阻塞其他事务写,但不阻塞其他事务读;
读已提交(Read Committed)
当前事务只能读取到其他事务提交的数据。解决了脏读
可重复读(Repeatable Read)
当前事务不能读取到其他事务提交的数据。解决了不可重复读
没有解决幻读
Binsert Aupdate Aselect 多了一行
串行化(Serializable)
所有SELECT语句会隐式转化为 SELECT...FOR SHARE,即加共享锁。
读加共享锁,写加排他锁,读写互斥。如果有未提交的事务正在修改某些行,所有select这些行的语句都会阻塞。
读加共享锁,写加排他锁,读写互斥。如果有未提交的事务正在修改某些行,所有select这些行的语句都会阻塞。
Mysql 默认的事务隔离级别是可重复读(Repeatable Read)
实现原理
Innodb在RR隔离级别下怎么解决幻读
MySql使用不同的锁策略(Locking Strategy)/MVCC来实现四种不同的隔离级别。
RR、RC的实现原理跟MVCC有关,RU和Serializable跟锁有关。
RR、RC的实现原理跟MVCC有关,RU和Serializable跟锁有关。
RR跟RC隔离级别,最大的区别就是:
RC每次读取数据前都生成一个ReadView,
而RR只在第一次读取数据时生成一个ReadView。
RC每次读取数据前都生成一个ReadView,
而RR只在第一次读取数据时生成一个ReadView。
Innodb在RR隔离级别下怎么解决幻读
针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
MVCC的实现原理
多版本并发控制,它是通过读取历史版本的数据,来降低并发事务冲突,从而提高并发性能的一种机制。
它的实现依赖于隐式字段、undo日志、快照读&当前读、Read View
它的实现依赖于隐式字段、undo日志、快照读&当前读、Read View
隐式字段
InnoDB存储引擎,每一行记录都有两个隐藏列DBTRXID,DBROLLPTR,
如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列 DBROWID。
如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列 DBROWID。
DBTRXID,记录每一行最近一次修改(修改/更新)它的事务ID,大小为6字节;
DBROLLPTR,这个隐藏列就相当于一个指针,指向回滚段的undo日志,大小为7字节;
DBROWID,单调递增的行ID,大小为6字节
DBROLLPTR,这个隐藏列就相当于一个指针,指向回滚段的undo日志,大小为7字节;
DBROWID,单调递增的行ID,大小为6字节
undo日志
事务未提交的时候,修改数据的镜像(修改前的旧版本),存到undo日志里。
以便事务回滚时,恢复旧版本数据,撤销未提交事务数据对数据库的影响。
undo日志是逻辑日志。可以这样认为,当delete一条记录时,undo log中会记录一条对应的insert记录,当update一条记录时,它记录一条对应相反的update记录。
存储undo日志的地方,就是回滚段。
以便事务回滚时,恢复旧版本数据,撤销未提交事务数据对数据库的影响。
undo日志是逻辑日志。可以这样认为,当delete一条记录时,undo log中会记录一条对应的insert记录,当update一条记录时,它记录一条对应相反的update记录。
存储undo日志的地方,就是回滚段。
多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(DBROLLPTR)连一条Undo日志链。
快照读&当前读
快照读:
读取的是记录数据的可见版本(有旧的版本),不加锁,普通的select语句都是快照读
读取的是记录数据的可见版本(有旧的版本),不加锁,普通的select语句都是快照读
select * from account where id>2;
当前读:
读取的是记录数据的最新版本,显示加锁的都是当前读
读取的是记录数据的最新版本,显示加锁的都是当前读
select * from account where id>2 lock in share mode
select * from account where id > 2 for update
select * from account where id > 2 for update
Read View
Read View就是事务执行快照读时,产生的读视图。
事务执行快照读时,会生成数据库系统当前的一个快照,记录当前系统中还有哪些活跃的读写事务,把它们放到一个列表里。
Read View主要是用来做可见性判断的,即判断当前事务可见哪个版本的数据
事务执行快照读时,会生成数据库系统当前的一个快照,记录当前系统中还有哪些活跃的读写事务,把它们放到一个列表里。
Read View主要是用来做可见性判断的,即判断当前事务可见哪个版本的数据
索引
分类
数据结构分类
B+tree索引
Hash索引
Full-text索引
物理存储分类
聚簇索引
叶子节点存储了一行完整的表数据,叶子节点间按id列递增连接
非聚簇索引
二级索引
二级索引
叶子节点并不存储一行完整的表数据,而是存储了聚簇索引所在列的值。
字段特性分类
主键索引
建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。
唯一索引
建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。
普通索引
建立在普通字段上的索引被称为普通索引。
前缀索引
对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引,而不是在整个字段上建索引
字段个数分类
单列索引
建立在单个列上的索引被称为单列索引。
联合索引
建立在多个列上的索引被称为联合索引,又叫复合索引、组合索引。
常见题
覆盖索引
查询列要被所建的索引覆盖,不必从数据表中读取,换句话说查询列
要被所使用的索引覆盖。
要被所使用的索引覆盖。
回表
二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,
再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。
再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。
索引失效
查询条件包含or,可能导致索引失效
如果字段类型是字符串,where时一定用引号括起来,否则索引失效
like通配符可能导致索引失效
like查询是以%开头,才会导致索引失效
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
最左前缀原则
锁
锁分类
行级锁
读锁
写锁
间隙锁
行锁
临键锁(next-key lock)
表级锁
自增锁
元数据锁
表锁
常见题
死锁
其他
执行流程
SELECT
连接建立
UPDATE
LOG
binlog
undolog
redolog
expain
0 条评论
下一页