提纲:

🔥优化

  • 数据库

  • 索引

  • Explain语句解析 SQL 语句(性能从高到底)

🎈面试八股真题(27个)

  • 1、数据库的三范式是什么

  • 2、MySQL数据库引擎有哪些

  • 3、说说InnoDB与MyISAM的区别

  • 4、数据库的事务

  • 5、索引是什么

  • 6、SQL优化手段有哪些

  • 7、简单说一说drop、delete与truncate的区别

  • 8、什么是视图

  • 9、什么是内联接、左外联接、右外联接?

  • 10、并发事务带来哪些问题?

  • 11、事务隔离级别有哪些?MySQL的默认隔离级别是?

  • 12、大表如何优化?

  • 13、分库分表之后,id 主键如何处理?

  • 14、说说在 MySQL 中一条查询 SQL 是如何执行的?

  • 15、为什么 SELECT COUNT(*) FROM table 在 InnoDB 比MyISAM 慢?

  • 16、说说 InnoDB 与 MyISAM 有什么区别?

  • 17、MySQL 索引类型有哪些?

  • 18、什么时候不要使用索引?

  • 19、说说什么是 MVCC?

  • 20、MVCC 可以为数据库解决什么问题?

  • 21、说说 MVCC 的实现原理

  • 22、请说说 MySQL 数据库的锁?

  • 23、说说什么是锁升级?

  • 24、怎样尽量避免死锁的出现?

  • 25、主键和候选键有什么区别?

  • 26、主键与索引有什么区别?

  • 27、MySQL 如何做到高可用方案?

一、优化

1. 数据库

  • 1、数据增删改不频繁的情况下,可以使用查询缓存,并设置较大的 query_cache_size

  • 2、配置全局 InnoDB 引擎缓存大小,即适当增大 innodb_buffer_pool_size

  • 3、若数据库单个事务很大,或是写入非常频繁,可以适当调大 binlog 缓存大小,binlog_cache_size

  • 4、InnoDB 默认每秒进行一次 redo-log 缓存写入磁盘,若相信自己的 MySQL 服务器,可以设置为当redo-log 缓存写满时再写入磁盘,并调大 innodb_log_buffer_size 大小

    ......

  • # 核心思想:MySQL 是 I/O 密集型应用,如何减少 I/O 次数是 MySQL 数据库优化的核心

2.索引

  • 1、经常需要进行前导 like 模糊匹配的,不建索引

  • 2、经常使用负向条件的,如 !=,不建索引

  • 3、使用时,遵守最左前缀法则

  • 4、字段过长的,可以用 prefix 作前缀索引

  • 5、条件查询中 or 字段的条件没有使用索引时,其他索引也会失效

  • 6、查询时发生运算,也会索引失效,最典型的字符串匹配,字符串值不加 ' ',MySQL 会进行类型转换,相当于一次运算

  • 7、利用覆盖索引,可以从索引中直接获取查询的字段,减少回表查询

    ......

3.表

  • 数据类型

    • 1、尽量不要用 DOUBLE 存储小数,有内存和精度问题,可以使用 INT 按固定倍率进行存储

    • 2、尽量不要用 BLOB 数据存放图片等大型文件

    • 3、可以用 ENUM 枚举类型来存储状态值

      ......

  • 表结构

    • 1、适当添加冗余字段,减少多表查询

    • 2、大表拆分

      • 竖直拆分

        • 垂直分表:将一张表的字段拆开分配到多张表中,一般将常用字段放在一个表中,将不常用字段放在另一张表中

        • 垂直分库:将一张表中的字段按照业务分配到不同的表中,适合业务耦合度非常低的场景

        • 优点:垂直分表可以使查询热点字段的效率更高,垂直分库可以使表的结构和逻辑清晰,便于维护

        • 缺点

          • 1、垂直分库分表并没有减少数据数量

          • 2、垂直分库分表需要在服务器代码中对 SQL 语句进行大量修改,并且不可避免的带来了多表查询

          • 3、对于主键和一些所有业务通用的字段,垂直分库分表必然导致这些字段的冗余,从而消耗存储空间

      • 水平拆分

        • 水平分表:在同一个数据库中,把一张表的数据分到多张表进行存储,一般按照主键 ID 进行划分

        • 水平分库:将一张表的数据分到多个数据库中的多张表进行存储,类似于 Redis 分片

        • 优点:水平分库分表解决了单表单库数据存储量上限的问题

        • 缺点

          • 1、对于一些范围查找,会涉及到跨节点的 JOIN 连接,性能会非常差——可以在进行两次查询,在服务端代码实现数据的聚合

          • 2、事务的一致性会变差——可以将一个跨节点的事务分成多个小的单节点事务,或是使用分布式事务

          • 3、进行 MySQL 数据库扩容难度大,不易于维护

4.Explain语句解析 SQL 语句(性能从高到底)

  • 1、ID —— 表示将 SQL 语句划分为多个操作后,每个操作的顺序

  • 2、select_type —— 表示 SQL 语句查询类型

    • Simple:单表查询,如果是多表联查就是多次 Simple

    • Primary & Subquery:表示嵌套查询中的外查询,以及用作 Where 子句中查询条件的子查询

    • derived:表示嵌套查询的子查询用作 From 子句中表的子查询

    • Union Select/Union Result:前者表示 Union 子句后的并列查询,后者表示将两者拼合的操作,效率最低

  • 3、type —— 表示查询过程

    • null:没有进行查询,如 now() 函数获取当前时间

    • system:查询的表中只有一行数据

    • const:通过主键索引进行精确匹配查找

    • eq_ref:通过唯一索引进行精确匹配查找

    • ref:通过索引进行精确匹配查找,结果可能存在多条

    • range:通过索引进行范围查找,一般 sql 优化到这个等级即可

    • Index:遍历索引

    • all:遍历了表

  • 4、possible keys/key:表示可以使用的索引以及执行时真正使用的索引,可以通过 Select Using/Ignore/Force Index() 推荐/忽视/强制使用某个索引

  • 5、Extra:一些额外信息

    • Using Index/Using Index Condition:前者表示覆盖索引,没有进行回表,后者表示只是使用了索引但没有覆盖,进行回表查询

    • Using Filesort:表示没有使用索引的 Order By 排序

    • Using Temporary:表示将查询结果作为中间表进行了排序,如 Order By/Group By 等

二、面试八股真题🎈🎈🎈

1、数据库的三范式是什么

  • 第一范式:列不可再分

  • 第二范式:行可以唯一区分,主键约束

  • 第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束

  • 三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上。

2、MySQL数据库引擎有哪些

  • 如何查看mysql提供的所有存储引擎: mysql> show engines;

  • mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE

    • MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎

    • Innodb:行级锁,提供了具有提交、回滚和崩溃回复能力的事务安全,支持自动增长列,支持外键约束,并发能力强,占用空间是MYISAM的2.5倍,处理效率相对会差一些

    • Memory:全表锁,存储在内容中,速度快,但会占用和数据量成正比的内存空间且数据在mysql重启时会丢失,默认使用HASH索引,检索效率非常高,但不适用于精确查找,主要用于那些内容变化不频繁的代码表

    • MERGE:是一组MYISAM表的组合

3、说说InnoDB与MyISAM的区别

  • 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

  • 2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

  • 3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

  • 4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

  • 5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

4、数据库的事务

  • 什么是事务?

    • 多条sql语句,要么全部成功,要么全部失败。

  • 事务的特性:

    • 原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性

      (Durabiliy)。简称ACID

    • 原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始状态。

    • 一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。如A转账100元给B,不管操作是否成功,A和B的账户总额是不变的。

    • 隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰

    • 持久性:一旦