热门标签 | 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时指的时有操作系统自己判断什么时候刷新。



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
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社区 版权所有