【八股学习】MySQL——三大日志、索引

首先,三大日志分别是:redo log、bin log、undo log
重点也就是如下部分:每个日志的作用、刷盘时机

日志

redo log

作用

让 MySQL 拥有了崩溃恢复能力。比如 MySQL 实例挂了或宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与完整性

刷盘时机

在查询时,InnoDB会将数据页读入 Buffer Pool 以便后续查找,减少磁盘IO。
同理,更新数据时,Buffer Pool 中存在要更新的数据就直接在其中更新,然后记录到 redo log buffer,随后刷盘到磁盘中的 redo log。
innodb_flush_log_at_trx_commit有三种策略

  1. 0:事务提交不刷盘、性能最高。但是如果MySQL挂了或者发生宕机,会丢失1s的事务
  2. 1(默认):每次事务提交都刷盘、性能最低,不会丢失任何数据
  3. 2:每次事务提交只把log buffer里的redo log写入 page cache。宕机会有1s损失。
    当然,没有提交事务的redo log也有可能刷屏。
    因为后台线程每秒都将 buffer 中的数据写入 page cache再刷盘。
    数据页刷盘是随机写,并且每次只更改了数据页中 n Byte的数据,性能很差。
    但是redo log 一行记录几十字节,并且是顺序写,所以刷盘很快
日志文件组

每次刷盘,write pos 后移更新,加载内容恢复数据时,checkpoint后移。

binlog

MySQL 数据

### Java面试中关于MySQL的高频问题及解答 #### 1. MySQL索引的工作原理是什么? MySQL索引是一种用于快速查找表中特定记录的数据结构。最常用的索引类型是B+树索引,它具有良好的查询性能和插入删除效率。当创建索引时,MySQL会按照指定列的值构建一棵B+树,并将数据页指针存储在叶子节点上[^1]。 对于复合索引(Composite Index),需要注意“最左前缀原则”,即只有查询条件包含了索引定义中最左边的部分或全部字段时,才能利用该索引加速查询[^2]。 ```sql CREATE INDEX idx_name ON table_name(column1, column2); EXPLAIN SELECT * FROM table_name WHERE column1 = 'value' AND column2 = 'value'; ``` --- #### 2. 如何优化MySQL查询性能? 优化MySQL查询可以从以下几个方面入手: - **合理使用索引**:为经常作为过滤条件的列建立合适的索引。 - **避免全表扫描**:确保WHERE子句中的列已建有索引。 - **减少不必要的JOIN操作**:过多的JOIN可能导致笛卡尔积膨胀,影响执行计划。 - **分析慢查询日志**:启用`slow_query_log`功能定位耗时较长的SQL语句并针对性改进。 示例代码如下: ```sql SET GLOBAL slow_query_log = 'ON'; SHOW VARIABLES LIKE 'slow_query_log_file'; SELECT SQL_NO_CACHE ...; -- 测试单条SQL的实际运行时间 ``` --- #### 3. 数据库事务隔离级别有哪些?分别解决什么问题? MySQL支持四种标准的事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)以及串行化(Serializable)。不同级别的主要区别在于它们对脏读、不可重复读和幻读现象的支持程度[^4]。 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | |------------------|------|------------|-------| | READ UNCOMMITTED | 是 | 是 | 是 | | READ COMMITTED | 否 | 是 | 是 | | REPEATABLE READ | 否 | 否 | 是 | | SERIALIZABLE | 否 | 否 | 否 | 默认情况下,InnoDB引擎采用的是REPEATABLE READ模式,在此设置下可以有效防止部分并发异常情况的发生。 --- #### 4. 分布式环境下的MySQL如何保证数据一致性? 在分布式系统中维护一致性的方法主要包括两阶段提交协议(2PC)、补偿事务(TCC)以及基于消息队列的消息最终一致性方案(MQ)。其中,2PC虽然简单易懂但存在单点故障风险;而TCC则更加灵活可控,适合复杂业务逻辑场景;至于后者,则依赖于可靠的消息传递机制达成跨服务间的状态同步目标。 具体实现细节需视乎具体的项目需求和技术栈选择而定。 --- #### 5. 常见的分库分表策略及其适用范围? 随着数据量的增长,单一实例难以满足高性能访问的要求,此时就需要考虑水平拆分技术——即将一张表分割成若干个小表分布在不同的物理设备之上。常见的分区依据包括但不限于日期维度、地域属性或者用户ID哈希值等等。 例如按月份保存订单信息: ```sql CREATE TABLE orders_YYYYMM ( id BIGINT NOT NULL AUTO_INCREMENT, order_date DATE NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; ``` 这种做法的好处是可以显著降低每次查询所需遍历的数据规模从而提升响应速度;然而同时也带来了诸如联合统计报表变得困难等问题需要额外处理。 --- ### 总结 上述内容概括了几类典型的围绕着关系型数据库管理系统展开的技术考察方向,既涉及基础理论层面的知识点巩固又兼顾到了工程实践当中遇到的真实难题探讨。希望这些资料能对你即将到来的职业发展之路有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值