MYSQL 存储引擎 和 日志

[复制链接]
发表于 2025-10-2 20:37:02 | 显示全部楼层 |阅读模式
存储引擎



  • InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
  • MyISAM 不提供变乱支持。InnoDB 提供变乱支持,实现了 SQL 标准界说了四个隔离级别。
  • MyISAM 不支持外键,而 InnoDB 支持。
  • MyISAM 不支持 MVCC,而 InnoDB 支持。
  • 固然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引布局,但是两者的实现方式不太一样。InnoDB 使用缓冲池(Buffer Pool)缓存数据页和索引页,MyISAM 使用键缓存(Key Cache)仅缓存索引页而不缓存数据页。
  • MyISAM 不支持数据库非常瓦解后的安全规复,而 InnoDB 支持。
  • InnoDB 的性能比 MyISAM 更强盛。

慢查询日志日志有什么用?


  • 性能优化:通太过析慢查询日志日志,可以发实际验时间长的 SQL,优化索引、调解查询语句或数据库设置。
  • 资源监控监控:辨认占用大量 CPU、内存或 I/O 的查询,制止影响其他业务。
  • 故障排查:定位导致数据库相应耽误的非常 SQL。
binlog 紧张纪录了什么?

Binlog(二进制日志日志 是 MySQL 纪录数据库变动的逻辑日志,紧张用于:

  • 主从复制:将主库的变动同步到从库。
  • 数据规复:通过回放 Binlog 规复数据。
  • 审计:纪录全部数据修改操纵。
纪录内容

  • 纪录 SQL 语句本身(如 UPDATE user SET age=20 WHERE id=1)。
  • 纪录详细行的变动(如 id=1 的 age 字段从 18 改为 20)。
特点

  • 逻辑日志:纪录的是 SQL 语义,而非物理数据页。
  • 依靠变乱:Binlog 按变乱提交序次纪录,包管主从划一性。
写入机制


  • 变乱实行过程中,先把日志写到binlog cache,变乱提交的时间,再把binlog cache写到 binlog 文件中。
  • 由于一个变乱的 binlog 不能被拆开,无论这个变乱多大,也要确保一次性写入,以是体系会给每个线程分配一个块内存作为binlog cache。
  • 我们可以通过binlog_cache_size参数控制单个线程 binlog cache 巨细,如果存储内容高出了这个参数,就要暂存到磁盘(Swap)。

 


  • write 和 fsync 由参数sync_binlog控制,默认是1
  • write,是指把日志写入到文件体系的 page cache,并没有把数据长期化到磁盘,以是速率比力快
  • fsync,才是将数据长期化到磁盘的操纵
redo log 怎样包管变乱的长期性?    


Redo Log(重做日志) 是 InnoDB 的物理日志,用于包管变乱的长期性(Durability)。其核心机制是 Write-Ahead Logging (WAL)

  • 写日志先于写数据

    • 变乱修改数据时,先将操纵纪录到 Redo Log 缓冲区(InnoDB 的 ib_logfile 文件)。
    • Redo Log 缓冲区满或查抄点触发时,才会将日志刷盘。
    • 数据页的修改先暂存在 Buffer Pool,再异步刷盘到磁盘。
           
  • 瓦解规复

    • 如果数据库瓦解,重启时通过 Redo Log 重做(Redo)未完成的变乱,确保数据划一性。               
           
怎样包管长期性?

  • 变乱提交时:必须确保 Redo Log 已写入磁盘(fsync),才气返回乐成。
  • 查抄点(Checkpoint):定期将内存中的脏页(已修改的页)刷盘,并纪录查抄点位置,镌汰瓦解规复时须要重做的日志量。
页修改之后为什么不直接刷盘呢?刷盘机遇


  • MySQL 中数据是以页为单元,查询一条纪录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。
  • 后续的查询都是先从 Buffer Pool 中找,没有掷中再去硬盘加载,镌汰硬盘 IO 开销,提拔性能
  • 更新表数据的时间,也是云云,发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。
  • 然后会把“在某个数据页上做了什么修改”纪录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里。每条 redo 纪录由“表空间号+数据页号+偏移量+修改数据长度+详细修改的数据”构成。
                 


缘故原由

  • 性能题目

    • 直接刷盘会导致频仍的磁盘 I/O,显着低沉写入性能。
           
  • 缓冲池(Buffer Pool)的作用

    • 数据页的修改起首暂存在内存中的 Buffer Pool。
    • 通过批量刷盘(如组提交 Group Commit)镌汰 I/O 开销。
           
  • Redo Log 的保障

    • 纵然体系瓦解,Redo Log 可以重做未长期化的修改,确保数据不丢失。
           
刷盘机遇


  •         Buffer Pool 中的脏页到达阈值(如 innodb_max_dirty_pages_pct)。
  •         查抄点触发 ,由于InnoDB 定期会实行查抄点操纵,将内存中的脏数据(已修改但尚未写入磁盘的数据)革新到磁盘,而且会将相应的重做日志一同革新,以确保数据的划一性。
  •         服务器正常关闭时。
  •         当变乱提交时,log buffer 里的 redo log 会被革新到磁盘(可以通过innodb_flush_log_at_trx_commit参数控制)默认 1,提交时刷盘。
            innodb_flush_log_at_trx_commit 的值有 3 种,也就是共有 3 种刷盘战略:

  • 0:设置为 0 的时间,表现每次变乱提交时不举行刷盘操纵。这种方式性能最高,但是也最不安全,由于如果 MySQL 挂了或宕机了,大概会丢失迩来 1 秒内的变乱。
  • 1:设置为 1 的时间,表现每次变乱提交时都将举行刷盘操纵。这种方式性能最低,但是也安全,由于只要变乱提交乐成,redo log 纪录就肯定在磁盘里,不会有任何数据丢失。
  • 2:设置为 2 的时间,表现每次变乱提交时都只把 log buffer 里的 redo log 内容写入 page cache(文件体系缓存)。page cache 是专门用来缓存文件的,这里被缓存的文件就是 redo log 文件。这种方式的性能和安全性都介于前两者中心。

binlog 和 redolog 有什么区别?


  • 写入机遇差异:redo log 在变乱实行过程中可以不绝写入,而 binlog 只有在提交变乱时才写入。
  • Binlog 是逻辑日志,数据规复,包管数据划一性Redo Log 是物理日志,瓦解规复,包管变乱长期性

两阶段提交


  • 两阶段提交是办理两份日志之间的逻辑划一题目:好比 实行过程中写完 redo log 日志后,binlog 日志写期间发生了非常,由于 binlog 没写完就非常,这时间 binlog 内里没有对应的修改纪录。因此,之后用 binlog 日志规复数据时,就会少这一次更新,而原库由于 redo log 日志瓦解规复,规复出来的数据不划一。
  • 办理方案:将 redo log 的写入拆成了两个步调prepare和commit,这就是两阶段提交
  • 使用两阶段提交后,写入 binlog 时发生非常,但是由于 MySQL 根据 redo log 日志瓦解规复时,发现 redo log 还处于prepare阶段,而且没有对应 binlog 日志,就会回滚该变乱。

Undo log (回滚日志)

每一个变乱对数据的修改都会被纪录到 undo log ,当实行变乱过程中出现错误大概须要实行回滚操纵的话,MySQL 可以使用 undo log 将数据规复到变乱开始之前的状态。
MySQL InnoDB 引擎使用 undo log(回滚日志) 来包管变乱的原子性
undo log 属于逻辑日志,纪录的是 SQL 语句
好比说变乱实行一条 DELETE 语句,那 undo log 就会纪录一条相对应的 INSERT 语句。同时,undo log 的信息也会被纪录到 redo log 中,由于 undo log 也要实现长期性掩护
而且,undo-log 本身是会被删除清算的,比方 INSERT 操纵,在变乱提交之后就可以清撤消了;UPDATE/DELETE 操纵在变乱提交不会立刻删除,会参加 history list,由配景线程 purge 举行清算。
undo log 怎样包管变乱的原子性?

Undo Log 纪录数据修改前的旧值,用于变乱回滚和 MVCC:

  • 变乱回滚

    • 当变乱实行 ROLLBACK 或因错误停止时,通过 Undo Log 将数据规复到修改前的状态。
           
  • MVCC 读划一性

    • 读操纵通过 Undo Log 访问汗青版本数据,制止读到未提交或已回滚的修改。
           
  • 原子性包管

    • 如果变乱未提交,其他变乱无法看到其修改(通过 Undo Log 的版本控制)。
    • 变乱回滚时,通过 Undo Log 打消全部已做的修改。
           

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表