关于mysql常见面试题

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 个人学习总结

执行顺序

from确定主表 join确定子表 on 确定主表跟子表间条件 确定条件之后where确定主表数据过滤条件

拿到数据后进行一个分组 分组后查询聚合函数 聚合函数后用having过滤 然后才是select拿出数据 distinct过滤 order by 按什么顺序 limit 拿几个

数据库三范式

1保证每一列的原子性 比如班级名字 分别班级加名字

2满足1后 每一列有唯一性 依赖主键

3满足2后 外键引用id 不引入其他能通过id查到的数据

一般业务都会打破的

引擎方面

5.5之前 MYISAM 大锁 没事务

5.5之后 InnoDB 支持行锁 有事务

sql优化的话 首先排除偶然情况的前提下

去排除sql语句慢的

排查方法 工具的话 类似运维的SkyWalking 通过检测接口的时间跟接口内具体sql的时候去找到对应的sql语句

Mysql层面

1 通过explain关键字

2 show status like

3 show profile命令分析 (我觉得开销很大)

慢查询日志 自己配置开

找出之后就是分析了 分析的话

1通过explain分析 是否命中索引 索引的类型

2通过mysql的type来确定类型 如果all这种太大的话

考虑通过索引优化去变得更小

索引优化 一般就是建立联合索引覆盖索引 减少回表查询

实际上覆盖索引的话 比如abc 实际上是会创建a b c ab ac bc (不用过多了解)

所以如果我对我的索引列操作的话 索引就会失效 但是失效并不是没命中索引 只是没命中我们定义的覆盖索引abc 也是优化了的 只是没达到效果

索引的话就会有 索引结构类型 B+ HASH R-Tree空间 S-Full-text全文

索引类型 普通 唯一 主键 联合 全文 空间

B+ B区别

B+非子结点不存数据 只存指针 所以相对B的话B+的第一阶段树更多 所以阶级就更短

那么从根节点到数据的时间就更短 所以就意味着 速度更快

B+底层是双向循环链表 左右跟头尾都是相连的

所以支持任何角度的范围查询

索引失效

常用场景

1前面用or后面没用

2 后面列明用了范围查询

3 列名属性不一了解

8以上的字符串转数字 8一下 会先去做判断 比如"12345"=12345 如果返回1 字符串转为数字 也就是失效了 因为不存在12345这个列名

如果返回0 数字转为字符串 这个时候列明没变 自然也就不会失效了

4字符串不加引号

5索引上运算

本质就是对索引列进行操作导致的失效

索引设计原则

数据量要大

查询高的设立联合索引 也就是where后面的

联合索引中区分度高的在前 低的在后

如果字段内容长 考虑采用前缀索引

创建表的时候

从字段类型下手 varchar 跟char tinyint int bigint

sql语句的优化

union all代替union 少一次过滤

联表使用innerjoin 如果一定要左右表 小表为主表 不然太大了(小表的话比如for循环嵌套 小的在外 也就是小的表有几行数据 就要几个数据库连接 相对其大表在外的话节省了很多次数据库连接)

日志文件 redolog undolog binlog

redolog 记录物理页的变化 基于INnoDB引擎的

undolog记录逻辑页的变化 事务回滚

binlog 纯文本文件 主从复制的时候可以用

binlog没大小限制 redolog有会覆盖 binlog是一个一个写

redolog保证了持久性 undolog保证了一致性跟原子性 隔离性通过排他锁或者mvcc

mysql底层

sql接口

线程直接发送的sql mysql是不知道什么意思的 所以要通过sql接口

sql解析器

从sql接口拿到sql 进行解析 也就是让mysql读懂我们的sql语句

sql优化器 二选一

1 提出所有user表 通过id过滤 拿到name

2 提出所有user表 通过name过滤 拿到id

我们操作了数据 就会将磁盘的数据读取到innodb的 bufferpool(内存)

通过我们的落盘策略 1 定时将bufferpool写入redolog文件 2满了写

分库分表 从上往下考虑

一般采用分区够了 程序员不感知 同张表

水平分表 不拆分字段 就是拆分存储的id 比如1-10000 10001-20000

垂直 拆分字段 影响大 一般不用(冷热数据用)

水平分库类似取模id redis分片集群 但是无法动态扩容

水平要借助中间件 sharding-sphere或者mycat等

MVCC包含1隐藏字段2undolog日志3readView视图

隐藏字段包含事务id跟回滚指针 指向的就是上个事务id的版本

内部版本类似链表一样通过事务的id相连

在读已提交 也就是RC中 readView是会根据其他事务实时更新的

但是RR中 也就是可重复读中 是事务开始的时候是怎么样的 他就是怎么样的

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
1月前
|
存储 SQL 关系型数据库
MySQL 面试题
MySQL 的一些基础面试题
|
2月前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
3月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
3月前
|
SQL 算法 关系型数据库
面试:什么是死锁,如何避免或解决死锁;MySQL中的死锁现象,MySQL死锁如何解决
面试:什么是死锁,死锁产生的四个必要条件,如何避免或解决死锁;数据库锁,锁分类,控制事务;MySQL中的死锁现象,MySQL死锁如何解决
|
3月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
3月前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
4月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
4月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?