mysql面试题

mysql面试题2405

总结方法

  • 特点

    • 面试官问的问题,不是我们经常使用的问题,也不是基本知识的问题,而是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优化手段。
覆盖索引就是把查询的字段组合在一起,作为一个索引使用。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值