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

相关文章

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI