zoukankan      html  css  js  c++  java
  • mysql-查询与更新语句是如何执行的(1,2)

    一,一条SQL查询语句是如何执行的

            mysql大体分为server层与存储引擎;server层又分为:连接器、查询缓存、分析器、优化器、执行器;存储引擎层负责数据的存储和提取,支持InnoDB、MyISAM、Memory等多个存储引擎。

            查询缓存一般不建议使用。

    二,一条SQL更新语句是如何执行的

           1, mysql innodb引擎独有的日志:rodolog。更新一条数据的时候,会先把更新记录的操作记录到redolog中并更新内存,然后选择系统空闲的时候把更新操作刷新到磁盘中。redolog是循环写的,当写满时,会把之前的记录删除。所以不能代替binlog(1,是因为只有innodb引擎有。2,是不能持久化)

           2, binlog日志是server层的日志,不是某一个存储引擎独有的。binlog是可以追加写入的,可以用于定期备份恢复。

           3,更新一条sql的流程:写入新行->新行更新到内存中->写入redolog,处于prepare阶段->写binlog->提交事务,处于commit阶段。将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。如果不采用两阶段提交可能会出现:

                                                                                   3.1,先写redolog,再写bin log。如果写binlog前mysql故障,redo log一定会进行更新(InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。),但是binlog却没有记录。以后进行故障恢复时,会导致数据不一致。

                                                                                   3.2,先写bin log,再写redo log。如果写redo log时mysql故障。更新会失败,事务会回滚。但是binlog却记录了更新记录。如果以后用这个bin log恢复数据的时候,会发现多了一条事物,与原库的值不同。

  • 相关阅读:
    为什么使用C#开发软件的公司和程序员都很少?
    使用Redis之前5个必须了解的事情
    这段代码为什么捕获不到异常呢?谁能给个解释,谢谢。
    git报错
    C# 常用类库(字符串处理,汉字首字母拼音,注入攻击,缓存操作,Cookies操作,AES加密等)
    你所不知道的 CSS 负值技巧与细节
    CSS 属性选择器的深入挖掘
    探秘 flex 上下文中神奇的自动 margin
    CSS 火焰?不在话下
    不可思议的纯 CSS 实现鼠标跟随效果
  • 原文地址:https://www.cnblogs.com/enchaolee/p/11592553.html
Copyright © 2011-2022 走看看