一、为什么MySQL是面试的"必答题"?
- 数据库领域占比:MySQL占据全球关系型数据库市场份额Top 3,阿里、腾讯、美团等大厂核心系统深度依赖
- 技术栈深度检验:通过MySQL问题可考察候选人的数据结构理解、系统设计能力、性能优化思维三大维度
- 薪资挂钩指标:P6+/35k+岗位面试中,90%会涉及MySQL底层原理与高并发场景解决方案
MySQL中,如何定位慢查询? (先找到哪个sql查询的慢)
慢查询常用工具
1部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,可以分析这个接口哪部分比较慢,可以看到SQL的具体的执行时间,可以定位是哪个sql出了问题
2.MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置;
SQL语句执行很慢, 如何分析呢? (再分析为什么慢)
采用EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息
mysql 的 explain 执行结果
用mysql自动的执行计划 explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复;
possible_key: 当前sql可能会使用到的索引
key :当前sql实际命中的索引
key_len: 索引占用的大小
Extra :额外的优化建议
type: 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all;
system:查询系统中的表
const:根据主键查询
eq_ref:主键索引查询或唯一索引查询
ref:索引查询
range:范围查询
index:索引树扫描
all:全盘扫描
什么是索引 ?
主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗‘
MYSQL支持的存储引擎有哪些, 有什么区别 ?
搜索引擎区别
InnoDB:mysql5.5之后是默认的引擎,它支持事务、外键、表级锁和行级锁
MyISAM:它不支持事务、只有表级锁、也没有外键,用的不多
Memory:主要把数据存储在内存,支持表级锁,没有外键和事务,用的不多
索引的底层数据结构 ?
MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:第一阶数更多,路径更短,第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,第三是B+树便于扫库和区间查询,叶子节点是一个双向链表;、
B树和B+树的区别是什么呢?
第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的
所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定
第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存
储,并且叶子节点是一个双向链表
B树与B+树对比:
①:磁盘读写代价B+树更低;②:查询效率B+树更加稳定;③:B+树便于扫库和区间查询
B树 :B树每个节点可以有多个分支,即多叉
B+树
为什么MySQL默认使用B+树而不是B树或哈希表?
- 核心差异:
- B树:每个节点存储键值和数据,导致单个节点存储的键值少,树的高度较高,查询时磁盘I/O次数多。
- B+树:数据只存储在叶子节点,非叶子节点仅存键值,单个节点可存储更多键值,树的高度更低;叶子节点形成链表,范围查询效率提升5倍以上。
- 哈希表:适合等值查询(O(1)),但无法支持范围查询和排序,且哈希冲突处理代价高。
- 延伸问题:
-- 验证索引页大小(默认16KB)
SHOW VARIABLES LIKE 'innodb_page_size';
- 页大小设计:16KB平衡了内存利用率与磁盘I/O效率,B+树高度为3时可存储约 2000万行数据(