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

相关文章

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现