sql查询语句的执行过程,Mysql两种存储引擎MyISAM和Innodb的区别,事务介绍和autocommit自动提交

本文主要是介绍sql查询语句的执行过程,Mysql两种存储引擎MyISAM和Innodb的区别,事务介绍和autocommit自动提交,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于数据库查询优化,我们程序员最主要的工作就是优化sql语句和使索引有效。数据库服务器在接收到我们传入的sql语句后并不能马上对该sql进行执行,而是要经过一系列复杂的流程,最终变成二进制的机器码才能被执行的。我们在日常数据库操作,80%以上都是查询语句,这里就解析下查询语句的执行过程。

1-通过网络的通讯协议接收客户端传入的sql

2-查看该sql对应的结果在查询缓存中是否存在

——存在,则直接返回结果

——不存在,则继续往下走

3-由解析器来解析当前sql,最终形成初步的解析树

4-再由预处理器对解析树进行调整,完成占位符赋值等操作

5-查询优化器对最终的解析树进行优化,包括调整sql顺序,是否使用索引等

6-根据优化后的结果得出查询语句的执行计划,交给执行引擎

7-执行引擎调用存储引擎(Innodb,MyISAM)提供的api,由存储引擎完成数据的查询和返回结果

在这个执行过程中,最主要的就是5和6,查询优化,它是会帮我们自动选出一个最高效的执行计划。我们所要做的工作,就是编排一个高效的sql语句,让查询优化器去尽可能使用索引。


Mysql两种存储引擎MyISAM和Innodb的区别:
1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。它是提供表锁,当操作一条记录时,整个表都被锁住,不适合高并发场景。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
2) InnoDB用于事务处理应用程序,具有众多特性,包括事务支持、存储过程、视图等。它是提供行锁,当操作一条记录时,只是对当前行,其他行不受影响。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

实际场景中,如是写多读少的应用还是选择Innodb,性能更稳定,在并发情况下也能基本满足,如果是对读取速度要求比较快的应用还是选MyISAM。还有,数据库的数据如是巨大的,倾向于Innodb,因为支持事务日志,故障恢复。

1、可以用 show create table tablename 命令看表的引擎类型。

2、可以执行以下命令来切换引擎类型 alter table tablename engine = innodb;

事务主要用于处理操作量大,复杂度高的数据,可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务只用来管理 insert,update,delete 这些修改语句,保证这些修改操作的原子性和一致性。

对于支持事务的InnoDB类型的表,影响速度的主要原因是AUTOCOMMIT默认设置是打开的。比如select @autocommit,@@autocommit;就是查询autocommit标志是否打开。

mysql> select @autocommit,@@autocommit;//@autocommit是当前会话的,@@autocommit是整个全局的。
+-------------+--------------+
| @autocommit | @@autocommit |
+-------------+--------------+
|           1 |            1 |
+-------------+--------------+
1 row in set (0.00 sec)

这里显示为1表示都是默认打开。如要关闭,可以set @autocommit=0;set @@autocommit=0;不过这样只是临时关闭,在下次系统重启后或者mysql服务重新打开后,这个autocommit依然会默认开启。如要永久关闭,可以在mysql配置文件里修改,这里以linux环境修改mysql配置为例:

在/etc/mysql/mysql.conf.d目录下,编辑mysqld.cnf这个配置文件,修改如下:

修改完保存,然后重启mysql服务即可。
至于为什么要关闭autocommit,是因为在mysql里每次执行一条sql语句时,都会被当做事务自动提交,这样在遇到一些频繁的插入编辑记录sql操作时,就会大大影响性能。我们可以在执行sql前调用begin; 然后再写入多条sql形成一个事务(即使autocommit打开也可以),最后再调用commit提交; 这样只是提交一次,将大幅提高性能。

在关闭autocommit之后,我们要想使插入编辑sql语句真正执行,必须要在后面加commit,否则不会提交成功。当然,最好是开头begin,中间是多条sql语句,最后是commit,如下所示:

  

这篇关于sql查询语句的执行过程,Mysql两种存储引擎MyISAM和Innodb的区别,事务介绍和autocommit自动提交的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799966

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完