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