首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文搞懂MySQL中一条SQL语句是如何执行

曾在面试中被问过这样问题:SELECT * FROM A WHERE B=1 AND C=2 GROUP BY D ORDER BY D在MySQL中是如何执行?...语法分析:简单讲语法分析就是检查SQL是否符合MySQL语法和关键字,比如SELECT FROM A WHERE B=C给写成了SELECT FROM A WHERE B=C,这就会导致语法分析错误...,例如:图片语义分析(也叫词法分析):就是判断除了SQL关键字顺序之外其他语句词汇符不符合当前查询条件,比如FROM A,表A却不存在SELECT B,字段B不存在等等,例如:图片语法检查顺序:SELECT...优化器是在表中有多个索引时候MySQL优化器会按照最小成本原则(IO成本+CPU成本)决定使用哪个索引,或者有多表关联(join)时候决定各个表连接顺序。...3 回到面试题SELECT * FROM A WHERE B=1 AND C=2 GROUP BY D ORDER BY D,因为是单表查询,而且在WHERE过滤时候也比较简单,因此我们用流程图来表示下

39311

一条sql语句究竟是如何执行

我们先来看一看 mysql 整体架构图 其实从上图可以看出,由客户端发出请求之后,mysql主要分为server层和存储引擎层 server层 连接器 连接器主要是与客户端建立连接, 包含本地socket...如我们常用建立连接方式 mysql -h ip -P 3306 -u root -p 只要用过数据库同学,相信对上面的连接方式并不陌生,在连接之后还有一些权限验证等等,这些都是在连接器中完成。...具体解析词包括但不局限于 select/update/delete/or/in/where/group by/having/count/limit 等,如果分析到语法错误,会直接抛给客户端异常:...比如: select * from user where userId =1234; 在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,mysql会自动判断关键词和非关键词...比如一个典型例子是这样: 表T,对A、B、C列建立联合索引(A,B,C),在进行查询时候,当sql查询条件是:select xx where B=x and A=x and C=x.很多人会以为是用不到索引

37130
您找到你想要的搜索结果了吗?
是的
没有找到

执行一条 SQL 语句,期间发生了什么?

where id = 1; 但是有没有想过,执行一条 select 查询语句,在 MySQL 中期间发生了什么?...当然,我们本次查询语句(select * from product where id = 1)很简单,就是选择使用主键索引。...假设执行了这条查询语句: select id from product where id > 1 and name like 'i%'; 这条查询语句结果既可以使用主键索引,也可以使用普通索引,但是执行效率会不同...select * from product where id = 1; 这条查询语句查询条件用到了主键索引,而且是等值查询,同时主键 id 是唯一,不会有 id 相同记录,所以优化器决定选用访问类型为...全表扫描 举个全表扫描例子: select * from product where name = 'iphone'; 这条查询语句查询条件没有用到索引,所以优化器决定选用访问类型为 ALL 进行查询

74330

MySQl原来是这样执行

,dept ASC LIMIT 0,2; 执行连接器 开始执行这条sql时,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步,校验权限这一步是在图一连接器进行,对连接用户权限校验...接着执行SELECT后面的字段,SELECT后面可以是表字段也可以是聚合函数。 这里SELECT情况与是否存在GROUP BY有关,若是不存在Mysql直接按照上图内存中整列读取。...第二点是WHERE是对执行from USer操作后,加载表数据到内存后,WHERE是对原生表字段进行过滤,而HAVING是对SELECT字段进行过滤,也就是WHERE不能使用别名进行过滤。...因为执行WHERE时候,还没有SELECT,还没有给字段赋予别名。接着生成临时表如下图所示: ?...以前Mysql默认存储引擎MyISAM引擎是没redo log,而现在默认存储引擎InnoDB引擎便是透过redo 复杂度来拥护事务,保证事务能够准确回滚或者提交,保证事务ACID。

39240

面试官:听说你sql写挺溜,你说一说查询sql执行过程

,dept ASC LIMIT 0,2; 执行连接器 开始执行这条sql时,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步,校验权限这一步是在图一连接器进行,对连接用户权限校验...接着执行 SELECT后面的字段,SELECT后面可以是 表字段也可以是 聚合函数。 这里SELECT情况与是否存在GROUP BY有关,若是不存在Mysql直接按照上图内存中整列读取。...第二点是WHERE是对执行from USer操作后,加载表数据到内存后,WHERE是对原生表字段进行过滤,而HAVING是对SELECT字段进行过滤,也就是WHERE不能使用别名进行过滤。...因为执行WHERE时候,还没有SELECT,还没有给字段赋予别名。...以前Mysql默认存储引擎MyISAM引擎是没redo log,而现在默认存储引擎InnoDB引擎便是透过redo 复杂度来拥护事务,保证事务能够准确回滚或者提交,保证事务ACID。

25410

面试官:听说你sql写挺溜,你说一说查询sql执行过程

,dept ASC LIMIT 0,2; 执行连接器 开始执行这条sql时,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步,校验权限这一步是在图一连接器进行,对连接用户权限校验...接着执行SELECT后面的字段,SELECT后面可以是表字段也可以是聚合函数。 这里SELECT情况与是否存在GROUP BY有关,若是不存在Mysql直接按照上图内存中整列读取。...第二点是WHERE是对执行from USer操作后,加载表数据到内存后,WHERE是对原生表字段进行过滤,而HAVING是对SELECT字段进行过滤,也就是WHERE不能使用别名进行过滤。...因为执行WHERE时候,还没有SELECT,还没有给字段赋予别名。接着生成临时表如下图所示: ?...以前Mysql默认存储引擎MyISAM引擎是没redo log,而现在默认存储引擎InnoDB引擎便是透过redo 复杂度来拥护事务,保证事务能够准确回滚或者提交,保证事务ACID。

39310

select语句执行流程

MySQL Server层主要包含哪些组件? 连接器 查询缓存 分析器 优化器 执行器 连接器 连接器作用是? 连接器负责和客户端建立连接、获取权限、维持和管理连接。...# 连接mysql mysql -h 127.0.0.1 -P 3306 -u root 客户端首先和连接器通过TCP握手建立连接 对用户输入用户名和密码进行验证 验证失败会返回ERROR 1045...优化器 在经过分析器以后,MySQL Server已经知道想要干啥,但是怎么干,如何干才能更快,此时就需要借助优化器了。...优化器会在有多个索引时决定使用哪个索引,或者有多表关联时决定各个表连接顺序。 执行器 MySQL Server通过分析器知道要干啥,通过优化器知道怎么干,于是到达了执行器开始干。...select * from test where id = 1; 假设上述表没有索引,引擎是InnoDB,执行器会这样操作: 调用InnoDB引擎接口获取表"第一行",判断ID是否为1,如果不是则跳过

81530

Mysql实战之一条SQL查询语句是如何执行

1.前言作为一位开发人员,必然要和mysql打交道,平常肯定也写各种各样sql语句,下面咱们先来看一个非常简单sql语句select * from order where id = 10;我们看到这个...接下来,我就把一一给大家进行讲解,mysql执行过程3.Mysql架构图图片mysql整体分为两层:Server层和存储引擎层其中Server层包括连接器、分析器、优化器、执行器等,包含了Mysql...根据你输入sql语句,进行关键词匹配语句类型,比如是查询、删除、修改还是新增语句,识别数据库表是否存,字段是否存在。...,决定使用哪个索引;或者在一个语句有多表关联(join)时候,决定各个表连接顺序。...比如:select * from t1 join t2 using(id) where t1.c=10 and t2.d=20既可以先从表t1里面取出c=10记录id值,在根据id值关联表t2,

1K10

MySQL实战第一讲 - 一条SQL查询语句是如何执行

比如,你有个最简单表,表里只有一个 ID 字段,在执行下面这个查询语句时: select * from T where ID=10; 我们看到只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL...而对于你确定要使用查询缓存语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样: select SQL_CACHE * from T where ID=10; 需要注意是,MySQL 8.0...优化器是在表里面有多个索引时候,决定使用哪个索引;或者在一个语句有多表关联(join)时候,决定各个表连接顺序。...select * from T where ID=10; ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table...最后给大家留一个问题吧,如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”错误: “Unknown column ‘k’

53730

MySQL实战 -- 一条SQL查询语句是如何执行

比如,你有个最简单表,表里只有一个 ID 字段,在执行下面这个查询语句时: mysql> select * from T where ID=10; 我们看到只是输入一条语句,返回一个结果,却不知道这条语句在...而对于你确定要使用查询缓存语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样: mysql> select SQL_CACHE * from T where ID=10; 需要注意是,MySQL...比如你执行下面这样语句,这个语句是执行两个表 join: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;...mysql> select * from T where ID=10; ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost'...我给你留一个问题吧,如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”错误: “Unknown column ‘k’ in

1.5K30

BAT 必问 MySQL 面试题你都会吗?

小程序里题库越来越丰富了,最近上新了不少 MySQL 面试题。其中有一些面试题不常见,但却是 BAT 必问面试题。今天我抽一些面试题考考大家! ?...1、MySQL latin1 是什么字符集? 这个字符集相信大家都见过,一般在创建数据库时候会进行设置。它在 Java 中代表就是 ISO-8859-1。...3、表 xttblog 存在且该表中不存在 name 字段,那么执行 select * from xttblog where name = ‘业余草’ 肯定会报错,请问是在连接器,分析器,优化器,执行器等哪个阶段报错...因为,连接器是负责处理管理连接,权限验证;分析器是进行词法分析,语法分析;优化器是进行语句优化,生成执行计划,选择索引;执行器是真正执行 SQL 语句,并返回结果集。...比如,select now() 就不能缓存,再比如,select version() 就没必要缓存。综合考虑,MySQL 把它给移除了。 更多关于 MySQL 面试题,参考我面试题小程序。

57820

MySQL基础篇1 mysql基础架构

, MySQL5.5.5 以后默认innodb,不同存储引擎表数据存取方式也不同 不同存储引擎共用一个server层,也就是连接器到执行器部分 server层 包括连接器,查询缓存,分析器, 优化器...对于确定要使用缓存查询语句可以用SQL_CACHE显示指定,如下 mysql> select SQL_CACHE * from T where ID=10; 注意: 在mysql8.0 之后, 缓存查询功能不存在了...分析器 如果查询缓存未命中,就开始执行真正语句了,第一步就是解析sql语句 mysql需要识别出里面的字符串分别是什么, 代表着什么 识别:mysql从你输入select这个关键字识别出这是个查询语句...优化器 经过分析器后, mysql知道你要做什么, 在开始执行前还要经过优化器处理 优化器是在表里面有多个索引时候,决定使用哪个索引, 或者在一个语句有多表关联(join)时, 决定各个表连接顺序...eg: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 既可以先从表 t1 里面取出 c=10 记录 ID

72650

MySQL》系列 - select 语句是怎么执行

也许你司使用 Oracle、Pg 等等,但是大多数互联网公司,比如我司使用得最多还是 Mysql,重要性不言而喻。...select * from user where id = 1;  01 mysql 架构概览 要想理解这个问题就必须要知道 mysql 内部架构。...而对于要使用缓存语句则可用 SQL_CACHE 显示指定,像这样: select SQL_CACHE * from user where id = 1; PS:MySQL 8.0 及以上版本把查询缓存删掉了...具体表现就是 selectwhere、from 等关键字少了个字母,明显不符合 MySQL 语法,这次就会报个语法错误异常:它一般会提示错误行数,关注 "use near" 后面即可。 ?...两种方案执行结果是一样,但是效率不一样、占用资源也就不一样。优化器就是在选择执行方案。它优化是索引应该用哪个?多表联查应该先查哪个表?怎么连接等等。

2.1K20

MySQL逻辑架构

而对于确定要使用查询缓存语句,可以用SQL_CACHE显式指定,如下: mysql> select SQL_CACHE * from T where ID=10; 四、解析器 词法分析 语法分析 如果缓存没有命中的话...比如你执行下面这样语句,这个语句是执行两个表join: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;...mysql> select * from T where ID=10; ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost...八、问题2 如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”错误:“Unknown column ‘k’ in ‘where...你觉得这个错误是在哪个阶段报出来呢? 答案:分析器. MySQL会解析查询, 并创建内部数据结构(解析树). 分析器会检查: 数据表和数据列是否存在, 别名是否有歧义等.

1.1K00

MySql 入门到精通-sql查询语句执行过程,你真的知道吗?

如下sql 查询: mysql> select * from T where ID=10; 对于这条查询语句,我们再脑海里面肯定能知道它能返回 T 表内 ID=10 数据,但是,我们并不知道它在 MySQL...查询缓存 通过上面连接器,我们已经成功建立了连接,这个时候我们就可以用 select 语句了,此时就会进入到我们第二步:查询缓存。...显示指定就行了,如下所示: mysql> select SQL_CACHE * from T where ID=10; ---- 注意:MySQL 8.0 之后就已经将查询缓存这个模块整个彻底删除了...如下展示了两个表 join 操作: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 如上,mysql 可以从...在执行语句之前,它会判断我们对于 T 表有没有查询权限,如果没有权限,就会给我们返回没有权限错误提示,如下: mysql> select * from T where ID=10; ERROR 1142

1K30

MySQL进阶:索引与优化

10) is NULL或者is not NULL 有时候不走索引,都是MySQL底层会进行字段判断,看执行效率是否需要走索引还是走全文扫描。 11) in走索引,not in不走索引。...不可重复读〔Non-Repeatable Reads ) 一个事务在读取某些数据后某个时间,再次读取以前读过数据,却发现和以前读出数据不一致。...间隙锁:当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件已有数据进行加锁;对于键值在条件范围内但并不存在记录,叫做"间隙(GAP )",InnoDB也会对这个...File:应该读取哪个日志文件开始推送日志文件 Postition:文件哪个位置开始推送日志 Binlog_Ignore_DB:不需要同步数据库 slave节点 1) my.conf中配置以下内容:...3) 执行以下指令 指定当前从库对应主库IP地址,用户名,密码,从哪个日志文件开始那个位置开始同步推送日志。

60030

一条SQL查询语句是如何执行

处理连接 客户端向服务器发送请求并最终收到响应,本质上是一个进程间通信过程。 MySQL有专门用于处理连接模块——连接器。...SELECT * FROM t_user WHERE user_name = '蝉沐风' 并不会!说明缓存没有生效,为什么?...举两个简单例子∶ 当我们对多张表进行关联查询时候,以哪个数据作为基准表。 有多个索引可以使用时候,选择哪个索引。...mysql> EXPLAIN FORMAT=JSON SELECT * FROM t_user WHERE user_name = ''; 文本不会带大家详细了解执行计划每一个参数,内容很庞杂,大家先对...特点: 支持表级别的锁(插入和更新会锁表),不支持事务; 拥有较高插入(insert)和查询(select)速度; 存储了表行数(count速度更快)。 怎么快速向数据库插入100万条数据?

1.4K30

一条sql查询语句执行过程解析

客户端 server层:(所有跨存储引擎操作均在这一层完成,包含下面mysql核心功能及内置函数均在这一层完成) 连接器、查询缓存->分析器、优化器、执行器 存储层:(负责数据存储和提取,其架构模式是插件式...连接器 连接器会校验用户账号和密码,验证通过后,然后会去权限表获取用户拥有的权限。之后,这个连接里面的权限判断都将依赖此时读到权限。...> select SQL_CACHE * from T where ID=10; 需要注意,mysql8.0版本直接将查询缓存整块功能删掉了。...如在表里存在多个索引时,决定具体哪个索引;在具体执行sql时,决定执行先后顺序(join关联多个表时,先执行A表where条件或是B表mysql> select * from t1 join...t2 using(ID) where t1.c=10 and t2.d=20; 执行器 作用:开始执行语句 先判断是否有对执行表权限 根据表引擎定义,去使用引擎所提供接口 mysql> select

60030

MySQL实战 | MySQL逻辑架构—一条查询SQL是如何执行

select * from where id ='1'; 上图给出MySQL 基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 各个功能模块中执行过程。...而对于你确定要使用查询缓存语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样: mysql> select SQL_CACHE * from T where ID=10; 需要注意是,MySQL...优化器是在表里面有多个索引时候,决定使用哪个索引;或者在一个语句有多表关联(join)时候,决定各个表连接顺序。...执行SQL查询时候优化器主要执行如下任务: 选择最合适索引; 选择表扫还是走索引; 选择表关联顺序; 优化 where 子句; 排除管理中无用表; 决定 order by 和 group by 是否走索引...mysql> select * from T where ID=10; ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost'

1.1K30

数据库温故:Mysql底层原理起底

1、Mysql 底层结构 大体来说,MySQL 可以分为 Server 层 和 存储引擎层两部分: Server 层包括连接器、查询缓存、分析器、优化器、执行器等。 存储引擎层负责数据存储和提取。...下面是Mysql架构图: 图片 数据库Server 层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),...3、分析器:MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。 4、优化器:优化器是在表里面有多个索引时候,决定使用哪个索引。...3、redo log 是循环写,空间固定会用完;binlog 是可以追加写入。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前日志。...(假如text前10个字符唯一,也可以对text前10个字符建立索引); MySQL能估计出全表扫描比使用索引更快时,不使用索引; 6.2 联合索引优于单索引场景 由于MySQL每次查询只使用一个索引

1.2K218
领券