文章目录
mysql面试题2405
总结方法
-
特点
- 面试官问的问题,不是我们经常使用的问题,也不是基本知识的问题,而是mysql整体设计的问题。运行的过程,多数是机制和原理。
- 这些问题的答案,并不是我们会使用就可以理解的,这些需要我们主动的对这些问题进行理解。
- 这些问题也并不是我们懂就能说出来的,这个是需要多次的输出才可以组织好语言。
-
应对策略
-
平时的工作中,多看相关的博客,注重理解。
-
找工作的时候,就把自己看的这些博客进行整理,持续输出和练习,做到熟练运用。
-
多进行其他方面的文档,视频输出,把知识转化成自己的知识。
-
博客链接
- 学习最快的方式,就是用自己的语言对知识进行输出,如果别人能够听明白你的讲解,就证明你对知识理解的没有问题,否则就是你没有真正理解。
- MySQL进阶(索引、事务、锁)
- MySQL存储引擎
索引的实现原理
mysql的索引分为主键索引和二级索引,
mysql的索引实质上就是B+数的数据结构。
按照B+数的规则排列好主键id作为叶子节点,叶子节点下面保存了数据的详细信息。
二级索引属于辅助索引,它存储的数据还是主键的信息。
也就是通过二级索引查询到数据之后,还要回表到主键索引查询数据的详细信息。
mysql的执行流程
宏观上会有下面几个步骤
首先会通过连接器和mysql建立连接,
然后再通过分析器优化器和执行器,最终返回一个执行结果
优化器会根据一些成本的运算,然后去决定走那个索引。或连表的顺序,最终生成一个执行计划。
执行器会根据执行计划调用存储引擎层的api接口。
存储引擎层是一个可以插拔的数据,可以根据需要更换存储引擎,实现一个统一的api接口。
存储引擎,我们用的比较多的是innodb和mysam。
存储引擎的选择
innodb是一种事务性的存储引擎,可靠的业务适用
mysam是一种olap的存储引擎,适用于一些读多写少的场景。
innodb的架构理念
他是基于B树的索引结构,支持聚集索引和非集聚索引,
聚集索引是按照每张表的主键来排序的,相当于一种物理排序
非聚集索引是按照索引列的取值来排序的。相当于一种逻辑排序。
innodb数据文件和索引文件是分开存储的
它的特点是支持事务,行级锁,支持外键约束。
介绍下mysql的事务与锁机制
事务和锁都是避免mysql数据幻读的问题,也就是一个同一个数据,有的线程去修改,有的线程去读取,读取的时候读到一个错误的数据
行锁 临建锁 间隙锁 是innodb解决事务隔离性的一系列排他锁,
行锁 记录锁 比如唯一索引,默认会对查询这一行数据增加行锁。避免其他事务对这一行数据进行修改。
临键锁 锁定一个索引区间
间隙锁 这个主要是基于范围查询的时候会触发,也是锁定一个范围
所以适用的时候,尽量适用一个主键或唯一索引,避免大量数据被锁定这样一个情况。
共享锁和排他锁
行级锁分为共享锁和排他锁
使用锁的前提是使用innodb存储引擎和使用事务,并设置了隔离级别 Repeatable Read
共享锁,就是加了锁后,其他用户可以并发的读取数据,但是不可以修改数据。
排他锁,就是加了锁后,其他事务不能再对加锁的数据加任何类型的封锁,获取排他锁的事务既能读取数据,又能修改数据。
加锁的方式
增删改的数据默认会添加锁,默认添加的是排他锁,读不会加锁
mysql死锁的原因和处理方法
2)行级锁死锁
产生原因1:
事务中执行了一条没有索引条件的查询,引发全表扫描,把行级锁上升为全表记录锁定(等价于表级
锁),多个这样的事务执行后,就很容易产生死锁和阻塞,最终应用系统会越来越慢,发生阻塞或死锁。
解决方案1:
SQL语句中不要使用太复杂的关联多表的查询;使用explain“执行计划"对SQL语句进行分析,对于有全表扫描和
全表锁定的SQL语句,建立相应的索引进行优化。
产生原因2:
·两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁
Mysql优化的相关经验
- 查看sql语句是否对应的表,没有配置索引。
- 查看sql语句对应的索引是否生效。
- 查看sql是否关联的表太多,进行语句的优化。
- 如果sql太长,按照业务进行拆分,运用多线程进行执行,在把结果进行合并
读写分离中处理数据不一致问题
主从同步的原理
- 主库写binglog日志
- 从库读取主库的日志,然后进行数据同步
- 在主从同步的过程中会出现数据不一致的情况,运用cannal处理数据不一致的情况。
mysql的sql优化
1 加索引,这个是一种简单高效的手段,但是要选择合适的列,同时避免导致索引失效的操作,比如like,函数。
2 减少不必要的返回列,增加查询的速度。
3 根据查询优化器,优化sql的结构,比如是否全表扫描,避免子查询。
4 分库分表,在单表数据量过大,或者并发数过多的时候,这种方式可以提高查询的效率。
5 读写分离,可以减少写操作的压力,减少共享锁和独占锁的竞争。
mysql的回表怎么办
这个回表是发生在innodb存储引擎下,
innodb引擎先分聚簇索引和非聚簇索引,
聚簇索引叫主键索引,非聚簇索引也叫二级索引。
在查询的时候,从二级索引回到主键索引的查询会发生回表这个情况。
使用覆盖索引可以有效的减少回表的次数,也是一个常用的sql优化手段。
覆盖索引就是把查询的字段组合在一起,作为一个索引使用。