1、三大范式 2、SQL 语句在 MySQL 内部执行流程。 3、MyISAM 和 InnoDB 有什么区别? 4、redo log 了解吗? 5、redo log 的刷盘时机 6、redo log 是怎么记录日志的 7、什么是 binlog 8、binlog 记录格式 9、binlog 写入机制 10、redolog 和 binlog 的区别是什么 11、两阶段提交 12、什么是 undo log. 13、什么是 relaylog 14、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别? 15、数据库中的事务是什么? 16、聚簇索引与非聚簇索引 17、聚簇索引与非聚簇索引 18、索引哪些情况会失效
1、三大范式

连接器: 身份认证和权限相关(登录 MySQL 的时候)。 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。 优化器: 按照 MySQL 认为最优的方案去执行。 执行器: 执行语句,然后从存储引擎返回数据。执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。 插件式存储引擎:主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎。
3、MyISAM 和 InnoDB 有什么区别?
InnoDB 支持事务,MyISAM 不支持事务
InnoDB 支持外键,MyISAM 不支持外键
InnoDB 支持 MVCC(多版本并发控制),MyISAM 不支持
select count(*) from table 时,MyISAM 更快,因为它有一个变量保存了整个
表的总行数,可以直接读取,InnoDB 就需要全表扫描。
Innodb 不支持全文索引,而 MyISAM 支持全文索引(5.7 以后的 InnoDB 也支持全文索引)
InnoDB 支持表、行级锁,而 MyISAM 支持表级锁。
InnoDB 表必须有主键,而 MyISAM 可以没有主键
Innodb 表需要更多的内存和存储,而 MyISAM 可被压缩,存储空间较小,。
Innodb 按主键大小有序插入,MyISAM 记录插入顺序是,按记录插入顺序保存。
InnoDB 存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全,与
MyISAM 比 InnoDB 写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引
redo log(重做日志)是
InnoDB存储引擎独有的,它让
MySQL拥有了崩溃恢复能力。
MySQL实例挂了或宕机了,重启时,
InnoDB存储引擎会使用
redo log恢复数据,保证数据的持久性与完整性。
Buffer Pool里存在要更新的数据,就直接在
Buffer Pool里更新。然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(
redo log buffer)里,接着刷盘到
redo log文件里。
5、redo log 的刷盘时机

红色部分为 redo log buffer 属于内存 黄色部分为 page cache ,此时已经写入磁盘了,但是未进行持久化 绿色部分是硬盘,已经完成持久化
设置为0的时候,表示每次事务提交时不进行刷盘操作,只是保留在 redo log buffer中,mysql 崩溃会丢失1s的数据; 设置为1的时候,表示每次事务提交时都将进行刷盘操作(默认值),持久化到磁盘; 设置为2的时候,表示每次事务提交时都只把redo log buffer内容写入page cache,OS宕机会丢失1s的数据,因为未进行持久化;
6、redo log 是怎么记录日志的
redo log日志文件不只一个,而是以一个日志文件组的形式出现的,每个的
redo日志文件大小都是一样的。
4个文件,每个文件的大小是
1GB,整个
redo log日志文件组可以记录
4G的内容。

7、什么是 binlog
binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”。
不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog
日志。它的主要作用就是数据备份、主从复制。
binlog
会记录所有涉及更新数据的逻辑操作,属于逻辑日志,并且是顺序写。
8、binlog 记录格式
binlog日志有三种格式,可以通过
binlog_format参数指定。
statement :记录的内容是 SQL
语句原文,存在数据一致性问题;row:记录包含操作的具体数据,能保证同步数据的一致性; mixed:记录的内容是前两者的混合, MySQL
会判断这条SQL
语句是否可能引起数据不一致:如果是,就用row
格式,否则就用statement
格式。
9、binlog 写入机制
binlog cache,事务提交的时候,再把
binlog cache写到
binlog文件中。
binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为
binlog cache。
binlog_cache_size参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(
Swap)。
0:每次提交事务都只写入到文件系统的 page cache,由系统自行判断什么时候执行 fsync
,机器宕机,page cache
里面的 binlog 会丢失。1:每次提交事务都会执行 fsync
,就如同 redo log 日志刷盘流程 一样。N(N>1):每次提交事务都写入到文件系统的 page cache,但累积 N
个事务后才fsync
。如果机器宕机,会丢失最近N
个事务的binlog
日志。
10、redolog 和 binlog 的区别是什么
redolog 是 Innodb 独有的日志,而 binlog 是 server 层的,所有的存储引擎都有使用到; redolog 记录了具体的数值,对某个页做了什么修改,binlog 记录的操作内容; binlog 大小达到上限或者 flush log 会生成一个新的文件,而 redolog 有固定大小只能循环利用; binlog 日志没有 crash-safe 的能力,只能用于归档,而 redo log 有 crash-safe 能力; redo log 在事务执行过程中可以不断写入(刷盘设置为1,后台线程1s执行一次或者 redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候),而 binlog 只有在提交事务时才写入文件缓存系统;
11、两阶段提交
12、什么是 undo log.
DB_ROLL_PTR属性,可以将这些 undo log 都连起来,串成一个链表,形成版本链。

13、什么是 relaylog

聚簇索引即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 的主键索引的叶子节点中存放的就是数据行,所以它属于聚簇索引。 在 MySQL 中,InnoDB 引擎的表的 .ibd 文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。 非聚簇索引即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引(辅助索引)就属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。 辅助索引是我们人为创建的索引,它的叶子节点中存放的是主键,当我们通过辅助 索引查找到主键之后,再通过查找的主键去回表查找主键索引。 17、索引哪些情况会失效
查询条件包含 or,可能导致索引失效(or两边的条件都是索引才行)
如何字段类型是字符串,where 时一定用引号括起来,否则索引失效
like 通配符可能导致索引失效。
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
在索引列上使用 mysql 的内置函数,索引失效。
对索引列运算(如,+、-、*、/),索引失效。
索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
索引字段上使用 is null, is not null,可能导致索引失效。
左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
mysql 估计使用全表扫描要比使用索引快,则不使用索引。
数据量少的不适合加索引
更新比较频繁的也不适合加索引
区分度低的字段不适合加索引(如性别)
---THE END---





