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