MySQL面经

目录

  • 基础篇
    • MySQL 的存储引擎有哪些?为什么常用InnoDB?
    • B+ 树和 B 树的比较
    • 为什么用B+树,不用B树或者AVL(优点)/哈希表
    • 关系型数据库和非关系型数据库的区别
    • MySQL解析过程,执行过程
    • 如何优化数据库
    • 分表:
    • mysql的server层
    • SQL注入攻击
  • 索引
    • 聚簇和非聚簇索引的区别 td
    • 除了聚簇索引,还有什么索引?
    • 二级索引存放的有哪些数据?
    • 哪些情况下应该or不应该建立索引
    • 索引失效的情况:
    • 数据库的索引是如何实现的 td
    • 快照读和当前读
  • 事务
    • 什么是事务?
    • 事务的特性
    • 并发事务下会发生什么问题
    • 数据库事务的原子性如何保证,持久性和隔离性呢(ACID还有个一致性)
    • 事务隔离级别有哪些?
    • 什么是幻读?
    • 什么是MVCC?事务的MVCC如何实现?
    • 事务之间如何避免脏读?
  • 日志
    • 三种日志

基础篇

MySQL 的存储引擎有哪些?为什么常用InnoDB?

MySQL的存储引擎常用的主要有3个:

● InnoDB存储引擎: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有 很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit) 和回滚(rollback)。

● MyISAM存储引擎:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。

● MEMORY存储引擎: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引|擎作为临时表,存放查询的中间结果

常用InnoDB的原因是支持事务,且最小锁的粒度是行级锁

B+ 树和 B 树的比较

B 树和 B+ 都是通过多叉树的方式,会将树的高度变矮,所以这两个数据结构非常适合检索存于磁盘中的数据。 但是 MySQL 默认的存储引擎 InnoDB 采用的是 B+ 作为索引的数据结构,原因有:

  • B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少
  • B+ 树有大量的冗余节点(所有非叶子节点都是冗余索引),这些冗余索引让 B+ 树在插入、删除的效率都更高,比如删除根节点的时候,不会像 B 树那样会发生复杂的树的变化
  • B+ 树叶子节点之间用链表连接了起来,有利于范围查询,而 B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

为什么用B+树,不用B树或者AVL(优点)/哈希表

  1. IO次数少,B+树中间节点只存放索引,数据都在叶子节点中,中间节点可以存放更多索引项,索引树更加矮胖

  2. 范围查询效率高,B树需要遍历整个树,B+树只需要遍历叶子节点中的链表

  3. 查询效率更稳定,每次查询从根节点到叶节点路径长度相同

  4. 有大量的冗余节点,插入删除效率更高

哈希索引只支持精确查找,不支持部分和范围查找,无法用于排序和分组,并且遇到大量哈希值相等的情况后查找效率会降低

关系型数据库和非关系型数据库的区别

前者高度组织化结构化数据;后者存储的数据结构不固定更加灵活,可以减少一些空间和时间的开销,后者更加容易水平扩展
前者支持结构化查询语言,支持复杂的查询功能和表关联。后者只能进行简单的查询
前者支持事务,具有ACID特性。后者则是BASE,最终一致性

MySQL解析过程,执行过程

1、连接到 MySQL 服务器:客户端与 MySQL 服务器建立TCP连接。
2、解析查询语句:MySQL 服务器接收到客户端发送的查询请求后,首先进行语法解析和语义解析,确保查询语句的正确性。
3、查询缓存:MySQL 服务器检查查询缓存,如果

你可能感兴趣的:(计算机基础知识笔记,mysql)