• 「秋招系列」MySQL 面试核心 25 问(附答案)


    1、为什么使用索引?

    • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

    • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

    • 帮助服务器避免排序和临时表

    • 将随机 IO 变为顺序 IO。

    • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

    2、Innodb 为什么要用自增 id 作为主键?

    如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过 OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。

    3、MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?

    • MyISAM,B+Tree 叶节点的 data 域存放的是数据记录的地址,在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录,这被称为“非聚簇索引”

    • InnoDB,其数据文件本身就是索引文件,相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的节点 data 域保存了完整的数据记录,这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引,这被称为“聚簇索引”或者聚集索引,而其余的索引都作为辅助索引,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此,在设计表的时候,不建议使用过长的字段为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

    4、说一下 MySQL 是如何执行一条 SQL 的?具体步骤有哪些?

    SQL 执行的全部过程

    Server 层按顺序执行 sql 的步骤为:

    1. 客户端请求->

    2. 连接器(验证用户身份,给予权限) ->

    3. 查询缓存(存在缓存则直接返回,不存在则执行后续操作)->

    4. 分析器(对 SQL 进行词法分析和语法分析操作) ->

    5. 优化器(主要对执行的 sql 优化选择最优的执行方案方法) ->

    6. 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)->

    7. 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

    简单概括:

    • 连接器:管理连接、权限验证;

    • 查询缓存:命中缓存则直接返回结果;

    • 分析器:对 SQL 进行词法分析、语法分析;(判断查询的 SQL 字段是否存在也是在这步)

    • 优化器:执行计划生成、选择索引;

    • 执行器:操作引擎、返回结果;

    • 存储引擎:存储数据、提供读写接口。

    5、你了解 MySQL 的内部构造吗?一般可以分为哪两个部分?

    可以分为服务层和存储引擎层两部分,其中:

    服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

    存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认的存储引擎。

    6、说一说 Drop、Delete 与 Truncate 的共同点和区别

    第一种回答

    Drop、Delete、Truncate 都表示删除,但是三者有一些差别:

    Delete 用来删除表的全部或者一部分数据行,执行 Delete 之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的 delete 触发器。

    Truncate 删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE 比 Delete 更快,占用的空间更小。

  • 相关阅读:
    Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)
    【Linux内核性能优化】ulimit(nproc、nofile)
    回文链表判断
    Linux实操篇-组管理和权限管理
    有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
    联邦学习应用研究现状及发展趋势
    【王道代码】【2.3链表】d4
    大语言模型(LLM)技术名词表(一)
    【C++】杨辉三角+二维数组鞍点+strcpy()函数(字符串b中的字符复制到数组a中)
    把第三方jar引入到maven中
  • 原文地址:https://blog.csdn.net/ZHAOHUODIAN888/article/details/126691765