MySQL面试题

本文详细讨论了MySQL数据库中的慢查询解决方案、SQL执行计划分析、索引(如B+树、聚簇索引和覆盖索引)的重要性,以及事务特性、并发问题和隔离级别,还包括主从同步原理和分库分表策略。

1、定位慢查询

方案二:mysql自带慢日志

2、sql执行很慢,如何分析 SQL执行计划

NULL:这条sql执行的时候没有使用到表

 

3、索引&底层数据结构

为什么使用B+树

二叉树,红黑树都是二叉的,效率都不高

B树 也就是 B-树

灰色的是指针,蓝色的是数据 绿色部分就是索引对应的数据

也就是非叶子节点也存储数字

B+树

1、因为非叶子节点不存数据,所以不用把数据取出来,而B-树在非叶子节点有数据,需要进行数据的比较,需要读数据,所以磁盘读写代价要高些

2、B+树,多次查询都是差不多的查找路径

3、叶子节点都是通过双向指针连接的,更适合区间查询

4、聚簇索引&非聚簇索引&回表查询

聚簇索引也叫聚集索引,非聚簇索引也叫二级索引

回表查询

 先通过二级索引找到主键值,然后再到聚簇索引中拿到行数据

总结:

5、覆盖索引&超大分页面优化

第二个sql,name是二级索引

第三个sql,产生了回表查询

超大分页问题:可以用覆盖索引来解决

使用limit进行分页查询时,越往后,分页效率就越低

总结:

6、索引创建原则

添加前缀索引示例:

ALTER TABLE table_name
ADD INDEX idx_column_prefix (column_name(length));

这里的table_name是你想要添加索引的表名,column_name是要为其创建前缀索引的字段名,而length是所要索引的前缀长度。

例如,假设有一个用户表 users,其中包含一个非常长的 description 字段,你可能希望对前100个字符创建一个索引:

ALTER TABLE users
ADD INDEX idx_description_prefix (description(100));

这将在 description 列上创建一个仅包含每个记录前100个字符的索引。当然,选择合适的前缀长度需要根据实际业务场景和数据分布来确定。

总结:

 

7、索引失效场景

总结:

8、sql优化经验

从三方面 表设计 sql语句优化 主从复制、读写分离

表设计优化 sql语句优化

union all 代替 union  union all 查询出来的即使有重复数据,也会展示出来

union会帮你过滤掉

第五条:以小表为驱动

外面的小循环就相当于是一个小表,里面的小循环就是相当于一个大表

把小循环放到外面就相当于小循环有3次的连接,在里面分别执行1000次操作即可

把小循环放到里面就相当于小循环有1000次的连接,在里面分别执行3次操作即可

所以小表放外面会更好点

主从复制、读写分离

总结:

9、事务的特性

10、并发事务问题&隔离级别

脏读:

不可重复读:

幻读:

但是插入时又报错,说数据库中已经存在该数据了

事务的隔离级别:

总结:

11、事务- undo log 和redo log的区别

如果缓冲池中的数据没有刷新到磁盘中,中途出错了,会导致数据的丢失,解决方法:redo log

当可以正常的将缓冲次的数据刷新到磁盘中,redofile就没什么用,每隔一段时间就将redofile重置,redo log file 在磁盘有两份,可以互相同步数据

另外一种做法:undo log

总结:

12、事务mvcc

第二个ptr 是指 pointer

undo log 版本链:

记录undolog日志

事务3修改动作导致:又产生了一条事务日志,新的事务日志记录指针指向上一条的地址

事务4操作的结果导致:又产生一条事务日志

结果:

MVCC最后一块内容:readview

当前读:

快照读:

ReadView 读视图

预分配事务id就是5+1

readview创建者的事务id:就是5

 

在RC read committed 隔离级别下:

分析:

第一个读视图得到的条件:

版本链共有4个

4  4不满足右边的条件

3,3不满足右边的条件

2,2不满足右边的条件,第一个读视图得到的条件

所以在事务5的第一个读视图中可以读到事务2的数据

 第二个读视图的结果:

事务5的第二个读视图,在版本链中事务4不满足右边的条件

事务3满足右边的条件

也就是说事务5的第二个读视图可以读取到事务3的数据 ,也就是说事务5第二个查询拿到的结果就是第3条

也就是说在read committed 情况下,会存在相同查询得到不同结果的情况。

以上就是在RC级别下 read committed 是如何获取历史版本记录的

然后就是在RR级别下 repeatable read  读视图又是什么样子的?

在RR级别下,事务5的第一个读视图,根据上面的推导知道可以访问事务2的提交数据

后面的复用该ReadView,也就是说事务5查询到的都是事务2 提交时的数据,也就是读取到相同的数据

总结:

13、MySQL主从同步原理

二进制日志 binlog

总结:

14、MySQL分库分表

拆分策略:

垂直分库:

垂直分表:

分表也可能是在一个库里,并不一定是放到不同库

水平分库:

水平分表:

新的问题和技术:

 分库分表中间件可以有效的帮助我们解决刚才提出的分库分表的问题

总结:

最后:

精通mysql

### MySQL 面试题及答案整理 以下是关于 MySQL 的一些常见面试题及其解答: #### 数据库基础概念 1. **什么是数据库索引?** 索引是一种用于快速检索数据的技术,它通过创建额外的数据结构来加速查询操作。常见的索引类型有 B-Tree 和哈希表[^1]。 2. **MySQL 支持哪些存储引擎?** MySQL 常见的存储引擎包括 InnoDB 和 MyISAM。InnoDB 提供事务支持和外键约束,而 MyISAM 不支持这些功能但读取速度更快[^2]。 3. **如何优化 SQL 查询性能?** 可以通过以下方式优化查询性能: - 使用合适的索引来减少全表扫描的时间复杂度。 - 尽量避免使用 `SELECT *`,只选取必要的字段。 - 对于大数据集,考虑分页加载或分区表设计[^3]。 #### 实践应用问题 4. **解释一下 ACID 是什么?** ACID 表示原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation) 和持久性 (Durability),这是关系型数据库中事务处理的核心特性[^4]。 5. **如何解决死锁问题?** 死锁通常发生在两个或多个事务互相等待对方释放资源的情况下。可以通过设置超时时间或者调整事务顺序来降低发生概率[^5]。 6. **请描述主从复制的工作原理。** 主从复制是指将一个数据库服务器上的更改同步到其他服务器上的一种机制。主节点负责写入操作并将日志发送给从节点;从节点则根据接收到的日志执行相同的操作完成更新[^6]。 7. **举例说明联合查询的作用以及语法格式是什么样的?** 联合查询可以用来组合来自不同表格的结果集合。其基本形式如下所示: ```sql SELECT column_name(s) FROM table1 UNION [ALL] SELECT column_name(s) FROM table2; ``` 8. **谈谈你对视图的理解吧!** 视图是一个虚拟表,基于SQL语句构建而成,并不实际保存任何物理记录。它们能够简化复杂的查询逻辑并提供一定程度的安全保护措施[^7]。 9. **存储过程有什么优点呢?** 存储过程是一组预编译好的SQL指令序列, 它们被存放在数据库内部以便重复调用。相比普通的动态SQL而言具有更高的效率因为减少了网络传输开销同时也增强了安全性由于参数化输入降低了注入风险[^8]. --- 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值