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 数据备份与主从同步
相关推荐
远方16099 小时前
113-Oracle database26ai rpm安装和适配生产
大数据·数据库·sql·oracle·database
MMMMMMMMMMemory9 小时前
社区版oceanbase报警XA事务悬挂
数据库·oceanbase
OceanBase数据库官方博客9 小时前
APQO自适应参数化查询优化框架——OceanBase 校企联合研究成果
数据库·oceanbase·分布式数据库
Aloudata9 小时前
破解监管溯源难题:从表级血缘到算子级血缘的数据治理升级
数据库·数据挖掘·数据治理·元数据·数据血缘
OceanBase数据库官方博客9 小时前
中国联通软研院基于OceanBase引领运营商数智化转型新范式
数据库·oceanbase·分布式数据库
qq_297574679 小时前
MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)
xml·数据库·mysql
筷乐老六喝旺仔9 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
想做一只开心的菜鸡9 小时前
DARTS#02 | 从共识算法到存算分离:深度拆解云原生数据库的稳定性基石
数据库
咚咚?9 小时前
麒麟操作系统达梦数据库集群安装(一主一从)
数据库
Mr_Xuhhh9 小时前
MySQL复合查询详解:多表查询、子查询与合并查询
数据库·sql·mysql