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 数据备份与主从同步
相关推荐
计算机毕设VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss11 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL12 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_12 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_13 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB13 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
刀法如飞13 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
zbguolei14 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长14 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统