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

相关文章

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1