美文网首页
面试题之Mysql篇

面试题之Mysql篇

作者: TZX_0710 | 来源:发表于2020-08-20 13:58 被阅读0次

    Mysql篇

    1. Mysql架构组成有哪些?
    Mysql架构图
    2.Mysql的查询具体流程?

    客户端请求-->连接器(验证用户身份,授权)-->查询缓存(存在则直接返回,不存在继续执行)-->分析器(对sql进行词法分析和语法分析操作)-->优化器(对sql优化选择最佳方案)-->执行器(查看用户是否有执行权限,有则去使用引擎提供的接口)-->去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

    3. Mysql存储引擎
    3.1什么是存储引擎?

    存储引擎是Mysql的组件,用于处理不同类型的操作。一个数据库中多个表可以使用不同引擎满足各种性能和实际要求。

    3.2 mysql有哪些存储引擎?

    常见的存储引擎有InnoDb、MylSAM、Memory、NDB
    Innodb现在是Mysql默认存储引擎,支持行级事物、行级锁定和外键

    3.3 InnoDB和MylSAM的区别

    3.3.1. InnoDB支持事物,MyISAM不支持事物。
    3.3.2. InnoDB支持外键,MyISAM不支持。
    3.3.3 InnoDB是聚簇索引,MySAM是非聚簇索引。聚簇索引的文件存放在主键索引的叶子节点上,所以Innodb必须要主键。
    3.3.4 InnoDB不保存具体行数,所以select count(1)的时候在Innodb当中是全表扫描。Myisam用一个变量保存了整个表的行数,所以读取的时候直接读取变量即可.
    3.3.5 Innodb最小的力度是行锁,Myisam最小的粒度是表锁。一个更新一句会锁住整张表,导致其他查询可能会被阻塞,并发受限。

    3. select count(*) from table 哪个引擎查询更快?

    MyIsam查询更快,因为myisam直接读取变量则可,不需要全表扫描.Innodb是全表扫描一行一行累加,获取总数量

    Mysql 索引篇

    1. Mysql索引有什么作用?

    优势:
    提高数据检索效率,降低数据库IO的成本
    降低数据排序的成本,降低CPU的消耗
    劣势:
    索引也会占用内存。
    索引提高查询效率,同时会降低更新表的速度。

    2. Mysql索引分类

    数据结构角度

    1. B+树索引
    2. Hash索引
    3. Full-Text全文索引
    4. R-Tree索引
      物理存储角度
      聚集索引
      非聚集索引
      聚集索引和非聚集索引都是B+Tree结构

    2.1 B+Tree和B-Tree的区别

    B+Tree是B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构

    1. 非叶子节点只存储键值信息
    2. 所有叶子节点之间都有一个链指针
    3. 数据记录都存放在叶子节点中
      MyISAM引擎的叶子节点的数据域,存放的不是实际的数据记录,而是数据记录的地址。索引文件与数据文件分离的叫做非聚簇索引。
      InnoDB引擎的叶子节点的数据与,存放的就是实际的数据记录,Innodb的数据文件本身就是主键索引文件,这被称为聚簇索引

    2.2 哪些情况需要建立索引?

    1.主键自动建立唯一索引

    1. 频繁作为查询条件的字段。
      3.查询中与其他表关联的字段 外键索引
      4.单键/组合索引的选择问题,高并发情况下倾向组合索引
    2. 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
    3. 查询中统计或分组字段

    2.3 哪些情况不要增加索引?

    1. 表记录太少
    2. 经常增删改的表
    3. 数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引。
    4. 频繁更新的字段不适合创建索引
    5. where条件里用不到的字段建立索引

    2.4 MySql查询

    count(*) count(1) count(column)的区别?

    count()和count(1)在统计结果的时候不会忽略值为NULL
    count(column)只包括那一列,在统计结果的时候会忽略值为NULL的字段不会统计进去
    count(column)如果为主键,速度会比count(1)快
    count(columns)部位主键count(1)会比count(columns)快
    如果表多个列 并且没有主键count(1)效率优于count(
    )
    如果有主键 select count(主键)最优
    如果表只有一个字段 select count(*)最优

    mysql的 in和exists的区别

    1.exists对外表采用loop逐条查询,每次查询都会查看exists的条件语句,当exists里面能够返回记录行,条件为true,返回当前的这条记录。

    1. in 查询相当于多个or的语句
    2.4.1 物隔离级别? Msql的事物隔离级别默认?

    1.事物隔离级别分为、原子性、一致性、隔离、持久

    1. 原子性: 整个事物中的所有操作,要么全部完成,要么全部不完成,不可能暂停在中概念某个环境,发生错误的时候,事物回滚到事物开始前的状态
    2. 一致性: 在事物开始之前和事物结束以后,数据库的完整约束没有被破坏
    3. 隔离性:一个事物执行不能被其它事物干扰。一个事物内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事物之间不能互相干扰
    4. 持久性: 在事物完成以后,该事物对数据产生的更改会被持久保存在数据库之中。
    2.4.2幻读和不可重复读的区别
    1. 不可重复读的重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样
    2. 幻读的重点在于新增或者删除: 在同一事务中,同样的条件,第一次和第二次读出的数据记录不一样,因为中间有其他事物提交了插入或者删除
    2.4.3 事物隔离级别

    数据库事物的隔离级别有4种

    1. READ-UNCOMMITED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致藏独幻读或者不可重复读
    2. READ-COMMITED(读已提交):允许读取并发事物已提交的数据。可以阻止脏读, 但是幻读和不可重复读仍有可能
    3. REPEATABLE-READ:(可重复读)。可以阻止脏读和不可重复读,但幻读仍有可能发生
    4. SERIALIZABLE(可串行化):可以防止脏读,不可重复读以及幻读

    2.5 事物是如何通过日志来实现的?

    事物日志包括:重做日志redo 和回滚日志undo

    重做日志:实现持久化和原子性
    undo log:实现一致性

    2.6 Mysql有多少种日志?

    错误日志、查询日志、慢查询日志、二进制日志、中继日志、事物日志

    2.7 Mysql对分布式事物的支持

    Mysql从5.0.3 InnoDB存储引擎开始支持XA协议的分布式事物,一个分布式事物会涉及多个行动,这些行动本身是事物性的。
    Mysql的分布式事物模型,分为三块:

    1. 应用程序 定义了事物的边界,指定需要做哪些事物
    2. 资源管理器 提供了访问事务的方法,通常一个数据库就是一个资源管理器.
    3. 事物管理器 协调参与了全局事物中的各个事物
    2.8 分布式事务采用两段式提交的方式:

    第一阶段所有的事物节点开始准备,告诉事物管理器redy
    第二阶段事物管理器告诉每个节点是commit还是rollback。

    Mysql分库分表

    2.9 分库?

    一个库里表太多了,导致数据太多性能下降。把库中的表进行拆分,按照功能模块拆分

    减少增量数据写入时的锁对查询的影响
    单表查询下降,减少磁盘IO、延时变短
    分库之后分布式事物的问题,怎么保证数据的完整性和一致性?
    配主从
    主从复制slave会从master读取binlog来进行数据同步
    每个slave只有一个master 每个slave只能有一个唯一服务器的ID 每个master可以有多个slave
    主从最大的问题?
    延时

    相关文章

      网友评论

          本文标题:面试题之Mysql篇

          本文链接:https://www.haomeiwen.com/subject/nxledktx.html