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恢复数据的时候,会发现多了一条事物,与原库的值不同。

  • 相关阅读:
    CSS选择器规范
    利用form的“acceptcharset”在不同编码的页面间提交表单
    学习Ruby的基础知识
    Watir和watir webdriver的区别
    PHP in_array() 函数
    Ruby数组的基础知识
    PHP smarty if的条件修饰词
    很好的自动化学习资料 Ruby watir selenium
    $(document).ready() 和window.onload
    收藏:简单的PHP+SMARTY分页类
  • 原文地址:https://www.cnblogs.com/enchaolee/p/11592553.html
Copyright © 2011-2022 走看看