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

相关文章

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安