热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

mysql中语句一直执行不了_浅谈MySQL中sql语句执行

查询语句执行咱们首先来讲一下MySQL中一条查询sql的执行过程,希望通过这个过程说明可以很好的了解MySQL的运行机制。大体的过程是:首先客户端发送一

查询语句执行

咱们首先来讲一下MySQL中一条查询sql的执行过程,希望通过这个过程说明可以很好的了解MySQL的运行机制。

大体的过程是:首先客户端发送一条查询语句到连接器,在连接器通过权限认证后查看查询缓存(query cache),如果这个查询在该缓存中则直接返回结果,但是如果不在该缓存中则到解析器,解析器通过语法解析和词法解析查看查询语句是否合法并将该查询语句解析成MySQL可以读懂的语言,然后通过优化器对该查询sql进行优化,选择最优的执行计划,最后通过执行器对sql执行。

连接器:是连接外部请求到MySQL的server端,并对其进行密码认证和权限认证。

查询缓存:一般会选择关闭,因为当对该表进行更新操作时,该表上的所有的查询缓存都会被清除。

解析器:对sql进行语法解析和词法解析,将对人友好的sql解析成对MySQL自己友好的语句。同时判断该sql的语法和词法是否正确,如果不正确则直接返回报错信息。

优化器:MySQL通过优化器确定最优的执行计划

执行器:真正的执行sql,并返回给客户端查询结果

更新语句执行

一条update更新操作的执行过程:

整体的执行过程和查询语句执行过程相同,但是执行器的执行执行完sql读取到数据之后的数据处理部分是什么样子呢,我们可以大概聊一下。现在以innodb存储引擎为例,因为从5.7之后的版本默认的存储引擎就是innodb存储引擎,并且8.0后的版本取消了myisam存储引擎。

MySQL将从磁盘上的数据缓存到内存中,然后执行器执行update操作并将源数据记录在undo中,之前的数据以视图的方式保留下来,直到没有事务再应用该数据后才会被释放,这就是MySQL的MVCC(多版本并发控制)。

查询语句和更新语句真正不同的是redo log和binlog的更新。当一条更新语句执行时MySQL会有日志先行的策略,首先是写redo,其中redo记录的时数据的物理信息,它是循环覆盖写的。当更新操作记录到redo中后会是prepare状态,然后是binlog进行记录然后提交最后redo进行commit,这个过程就是MySQL的两阶段提交。其中Binlog记录的是更新语句的逻辑信息,redo可以保证数据库的crash恢复。这时候咱们就有一个疑问了,如果我更新一条数据整好redo log写入磁盘了但是binlog还没有来得急提交,这时候服务器宕机,当再次重启服务器和数据库后这个事务怎么办呢?这时候MySQL为了数据的一致性,就会根据redo进行回滚操作从而保证数据的一致性。但是如果binlog也提交了但是redo还没有来得及提交,数据库启动后会认为这个事务以经完成了所以就会执行commit提交该事务。

说到这儿就不得不说一下控制redo和binlog的参数:

MySQL中有一个很有名的日志提交参数配置就是双1配置:

sync_binlog=1:binlog会在每次提交事务都会记录在磁盘中。当该值为0时则由操作系统自己判断当不繁忙再进行落盘,当为N则指有N个事务才进行落盘操作

innodb_flush_log_at_trx_commit:当该值为1时指事务提交及时刷新redolog到磁盘中保证了数据的安全,当为0时指的时redo每秒刷新一次,当为2时指的时有操作系统自己判断什么时候刷新。



推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • MySQL Server 8.0.28 升级至 8.0.30 的详细步骤
    为了修复安全漏洞,本文档提供了从 MySQL Server 8.0.28 升级到 8.0.30 的详细步骤,包括备份数据库、停止和删除旧服务、安装新版本以及配置相关环境变量。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 本文深入解析了 Kubernetes 控制平面(特别是 API 服务器)与集群节点之间的通信机制,并对其通信路径进行了详细分类。旨在帮助用户更好地理解和定制其安装配置,从而增强网络安全性,确保集群的稳定运行。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
author-avatar
qm38dal
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有