MySQL基础
- 关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。
- 常见关系型数据库:MySQL、Oracle、SQL Server、SQLite
-SQL 是一种结构化查询语言(Structured Query Language),专门用来与数据库打交道,目的是提供一种从数据库中读写数据的简单有效的方法。
MySQL存储引擎2
1.MySQL 支持哪些存储引擎?默认使用哪个?
2.MySQL 存储引擎架构了解吗?3
MySQL 存储引擎采用的是 插件式架构 ,支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的,而不是数据库。
3.MyISAM 和 InnoDB 有什么区别?5
- 1.是否支持行级锁:MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。这也是为什么 InnoDB 在并发写的时候,性能更牛皮了!
- 2.是否支持事务:MyISAM 不提供事务支持。InnoDB 提供事务支持.
- 3.是否支持外键:MyISAM 不支持,而 InnoDB 支持。
- 4.是否支持数据库异常崩溃后的安全恢复:MyISAM 不支持,而 InnoDB 支持。
- InnoDB 的性能比 MyISAM 更强大。
MySQL事务
4.何谓事务?4
5.何谓数据库事务?4
- 大多数情况下,我们在谈论事务的时候,如果没有特指分布式事务,往往指的就是数据库事务。
- 简单来说,数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 。
- 另外,关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性
6.事务四大特性?👍5
- 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
- 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
- 只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!
7.并发事务带来了哪些问题?不可重复和幻读有什么区别?5
1.脏读(Dirty read):
2.丢失修改(Lost to modify):
3.不可重复读(Unrepeatable read):
4.幻读(Phantom read):
举个例子:执行 delete 和 update 操作的时候,可以直接对记录加锁,保证事务安全。而执行 insert 操作的时候,由于记录锁(Record Lock)只能锁住已经存在的记录,为了避免插入新记录,需要依赖间隙锁(Gap Lock)。也就是说执行 insert 操作的时候需要依赖 Next-Key Lock(Record Lock+Gap Lock) 进行加锁来保证不出现幻读。
8.SQL 标准定义了哪些事务隔离级别?5
9.MySQL 的默认隔离级别是什么?能解决幻读问题么?5
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。
10.MySQL 的隔离级别是基于锁实现的吗?5
MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。锁可以看作是悲观控制的模式,多版本并发控制(MVCC,Multiversion concurrency control)可以看作是乐观控制的模式。
11.什么是MVCC?有什么用?原理了解吗?5
- MVCC (Multi-Version Concurrency Control)是一种并发控制机制,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。
- MVCC 在 MySQL 中实现所依赖的手段主要是: 隐藏字段、read view、undo log。
- undo log : undo log 用于记录某行数据的多个版本的数据。
- read view 和 隐藏字段 : 用来判断当前版本数据的可见性。
MySQL锁
12.表级锁和行级锁了解吗?有什么区别?4
- 表级锁: MySQL 中锁定粒度最大的一种锁(全局锁除外),是针对非索引字段加的锁,对当前操作的整张表加锁
- 行级锁:MySQL 中锁定粒度最小的一种锁,是 针对索引字段加的锁 ,只针对当前操作的行记录进行加锁
13.行级锁的使用有什么注意事项?4
InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁。
14.共享锁和排他锁呢?4
不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类。
15.意向锁有什么作用?4
如果需要用到表锁的话,如何判断表中的记录没有行锁呢,一行一行遍历肯定是不行,性能太差。我们需要用到一个叫做意向锁的东东来快速判断是否可以对某个表使用表锁。
16.InnoDB 有哪几类行锁?5
MySQL索引👍
17.何为索引?有什么作用?优缺点?底层数据结构?5
- 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。
- 优点:
- 主要是用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。
- 缺点:
- 创建索引和维护索引需要耗费许多时间。
- 底层数据结构:目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。
18.MySQL的索引结构为什么使用B+树?4
- 主要原因是它在大规模数据访问时表现出色,同时具有许多优点:
- 1.更适合磁盘存储:它将所有数据存储在叶子节点中,非叶子节点仅包含索引信息。这意味着在磁盘上连续存储数据,减少了磁盘I/O次数,提高了磁盘读取效率。
- 2.有序性: B+树是一棵平衡树,保持了数据的有序性。
- 3.支持多级索引: B+树的结构允许支持多级索引,使得可以有效地创建复合索引,提高查询性能。
19.主键索引和二级索引?4
数据表的主键列使用的就是主键索引。二级索引(Secondary Index)又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。
20.聚簇索引与非聚簇索引?4
前者:索引结构和数据在一起存放的索引,主键索引属于前者。后者:索引结构和数据分开放。
21.覆盖索引?4
覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了,而无需回表查询。
22.联合索引?4
23.最左前缀匹配原则了解吗?5
24.创建索引的注意事项有哪些?4
选择合适的字段创建索引、尽可能的考虑建立联合索引而不是单列索引、限制每张表上的索引数量
MySQL日志
25.常见的日志有哪些?3
- 错误日志(error log):对MySQL 的启动、运行、关闭过程进行了记录。
- 二进制日志 (binary log,binlog):主要记录的是更改数据库数据的SQL语句。
- 一般查询日志(general query log) ︰已建立连接的客户端发送给MySQL服务器的所有SQL记录,因为SQL的量比较大,默认是不开启的,也不建议开启。
- 慢查询日志(slow query log):执行时间超过long_query_time秒钟的查询,解决SQL慢查询问题的时候会用到。
- 事务日志(redo log和undo log) : redo log 是重做日志,undo log是回滚日志。
26.慢查询日志有什么用?3
27.binlog(二进制日志)主要记录了什么?有什么用?5
记录什么?
有什么用?
最主要的应用场景是主从复制,保证数据一致性。
28.redo log(重做日志)如何保证事务的持久性?5
redo log主要做的事情就是记录页的修改,比如某个页面某个偏移量处修改了几个字节的值以及具体被修改的内容是什么。在事务提交时,我们会将redo log按照刷盘策略刷到磁盘上去,这样即使MySQL宕机了,重启之后也能恢复未能写入磁盘的数据,从而保证事务的持久性。
29.页面修改之后为什么不直接刷盘呢?4
30.binlog和redolog有什么区别?4
31.undo log如何保证事务的原子性?5