MySQL篇3——MySQL深度揭秘:MySQL 索引失效情况与日志机制(redolog undolog binlog)介绍

一、索引为什么会失效(前置知识)

MySQL 索引本质是基于 B+ 树的有序结构进行查找。当查询条件无法命中索引树的查找路径时,就只能扫描更多的数据页甚至全表扫描,导致索引失效。

更通俗的说:

索引能否使用,取决于查询条件能否映射到已经建立好的索引结构上,若否则只能全表扫描。
一旦破坏原有有序性、跳过索引前缀或让字段被处理,就无法精准定位数据,自然索引就会失效


二、常见索引失效情况

  1. 对索引字段使用函数

    示例:

    sql 复制代码
    select * from t_user where upper(name) = 'TOM';

    因为函数改变了索引值,索引树无法直接对比

    MySQL 会转成:

    遍历 → 对每行执行函数 → 比较

    ➡ 不能走索引,退化为全表扫描

  2. 对索引字段做表达式计算

    sql 复制代码
    select * from t_user where age + 1 = 20;
    因为函数改变了索引值,索引树无法直接对比➡ 不能走索引,退化为全表扫描
  3. 存在隐式类型转换

    常见于 varchar 与 int 比较

    sql 复制代码
    select * from t_user where phone = 1300000001;

    phone 为 varchar,比较时会转换成 int,相当于:

    sql 复制代码
    select * from t_user where cast(phone as signed int) = 1300000001;
    MySQL 自动转换:CAST(phone AS signed) → 新值不在索引树里➡ 索引失效
  4. like 以通配符开头

    sql 复制代码
    select * from t_user where name like '%abc';
    MySQL 自动转换:CAST(phone AS signed) → 新值不在索引树里➡ 索引失效
  5. 联合索引不满足最左前缀原则

    联合索引 (a, b, c),可匹配:

    sql 复制代码
    where a = 1
    where a = 1 and b = 2
    where a = 1 and c = 3
    where b = 2 and a = 1

    无法匹配:

    sql 复制代码
    where b = 2
    where c = 3
    where b = 2 and c = 3

    所谓最左前缀法则,简单来说就是违背了b+树底层的有序性,必须从最左边开始,⽽⽆ 中断跳跃

  6. OR 条件中一侧无索引

    sql 复制代码
    select * from t_user where id = 1 or age = 18;

    如果 age 无索引

    MySQL 无法同时走索引 → 回退全表扫描(其实最本质的原因是它是或而不是短路或)

    解决:给 age 加索引 或拆查询


三、MySQL 日志机制

MySQL 使用多种日志来保证数据安全性、可恢复性与一致性,主要包含 Redo Log、Undo Log 和 BinLog。


1. Redo Log(重做日志)

简单来说:数据库崩溃,我可以快速恢复

作用:数据库崩溃后恢复已提交数据,保证持久性(事务中的 D)

记录内容:对数据页的物理修改

写入时机:事务提交时写入磁盘

示例理解:

管理员修改档案书 5 上的余额

Redo Log 记录:书 5 某位置数值修改(500 → 400)

若数据库崩溃

重启后根据 Redo Log 恢复为 400

数据即使未落盘,也能在数据库恢复后重建修改结果


2. Undo Log(回滚日志)

简单来说:写错了我可以撤销

作用:

  • 支持事务回滚,保证原子性(事务中的 A)

  • 支持 MVCC,多版本并发控制

记录内容:数据变更的反向操作

示例理解:

原 balance = 100,被改成 200

Undo Log 记录:撤销为 100

回滚时按记录恢复

其他事务若不可见该修改,通过版本链读 Undo Log 中的旧版本(MVCC)


3. BinLog(二进制日志)

简单来说:记录所有对数据库产生改动的操作,用于数据备份、主从同步和崩溃后的恢复。

属于 Server 层日志,用于备份与主从同步

记录内容:所有表结构变更与表数据修改(DML、DDL)

不记录:select、show 等查询语句


BinLog 日志格式
格式 记录内容 优点 缺点
Statement 原 SQL 语句 空间小 存在同步一致性风险
Row 每行记录改变前后值 最一致 文件大
Mixed MySQL 自适应选择 兼顾性能与一致性

示例说明:以图书馆为例

总馆记录:谁修改了哪本书

分馆根据记录同步

Row 模式中会记录 balance 500 → 400 的细节变化


四、总结

内容 主要作用
索引使用失败 查询无法在索引树上精准定位
Redo Log 崩溃恢复,保证已提交不丢失
Undo Log 回滚和 MVCC,保证未提交不生效
BinLog 数据备份与主从同步
相关推荐
分享牛10 分钟前
Operaton入门到精通23-Operaton 2.0 原生支持 JUnit 6 核心指南
数据库·junit
编码忘我30 分钟前
mysq系列之事务
数据库
知识分享小能手33 分钟前
Redis入门学习教程,从入门到精通,Redis进阶编程知识点详解(5)
数据库·redis·学习
MekoLi2938 分钟前
MongoDB 新手完全指南:从入门到精通的实战手册
数据库·后端
cyforkk43 分钟前
Spring AOP 进阶:揭秘 @annotation 参数绑定的底层逻辑
java·数据库·spring
2401_884970611 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python
麦聪聊数据1 小时前
快速将Oracle数据库发布为 API:使用 QuickAPI 实现 SQL2API
数据库·sql·低代码·oracle·restful
6+h1 小时前
【Redis】数据结构讲解
数据结构·数据库·redis
ID_180079054731 小时前
小红书笔记详情 API 接口系列 + 标准 JSON 返回参考(完整版)
数据库·笔记·json
wertyuytrewm1 小时前
用Python实现自动化的Web测试(Selenium)
jvm·数据库·python