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

MySQL逻辑架构

该层上,服务器会解析查询创建相应内部解析树,对其完成优化,如确定查询顺序,是否利用索引等,最后生成相关执行操作。如果是SELECT 语句,服务器还会查询内部缓存。...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等等,没关系,我会在后面的文章单独展开说明优化器内容。 六、执行器 判断对这个表有没有查询权限 有权限, 继续执行....比如我们这个例子表T,ID字段没有索引,那么执行器执行流程是这样: 调用InnoDB引擎接口取这个表一行,判断ID值是不是10,如果不是跳过如果是则将这行存在结果集中; 调用引擎接口取...“下一行”,重复相同判断逻辑,直到取到这个表最后一行。...如果是表变更,分别交给insert、update、delete、create、alter处理模块进行处理。 第三层:数据库引擎层 1、打开表,如果需要的话获取相应锁。

1.1K00

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

这个时间是由参数 wait_timeout 控制,默认值是 8 小时#查询缓存之前执行过语句及其结果可能会以 key-value 对形式,被直接缓存在内存key 是查询语句,value 是查询结果所以...,只要有对一个表更新,这个表上所有的查询缓存都会被清空所以,MySQL这样一个配置,你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认 SQL 语句都不使用查询缓存...打开表时候,执行器就会根据表引擎定义,去使用这个引擎提供接口没有索引情况下:1.调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中...;2.调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行。...你会在数据库查询日志中看到一个 rows_examined字段,表示这个语句执行过程扫描了多少行。这个值就是执行器> 每次调用引擎获取数据行时候累加

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

MySQL面试常问:一条语句提交后,数据库都做了什么?

为什么这里还要进行权限验证,因为除了sql 还可能有存储引擎,触发器等,在这些对象,也可能需要调用其它表去获取数据,也需要权限验证,前面的阶段对于触发器,存储引擎这种对象执行是做不到。...比如说: select * from T where ID=10; 如果 ID 字段没有索引,那么执行器执行流程是这样:调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过...,如果是则将这行存在结果集中;调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行。...假如在写 binlog 前异常重启,mysql 恢复后对状态为 prepare 状态事务进行回滚。 假如在写 binlog 后异常重启,判断对应事务 binlog 是否存在完整: a....如果是提交事务;b. 否则,回滚事务。 你可能会问,处于 prepare 阶段 redo log 加上完整 binlog,重启就能恢复,MySQL 为什么要这么设计?

89620

MySQL提升笔记(1):MySQL逻辑架构

值得一提MySQL8.0取消了查询缓存,大概理由是查询缓存存在严重可伸缩性问题,并且很容易成为严重瓶颈缓存,将缓存移动到客户端能收获更好性能。 ?...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等等,没关系,我会在后面的文章单独展开说明优化器内容。...开始执行时候,要先判断一下你对这个表T有没有执行查询权限,如果没有,就会返回没有权限错误,如下所示(工程实现上,如果命中查询缓存,会在查询缓存放回结果时候,做权限验证。...比如我们这个例子表T,ID字段没有索引,那么执行器执行流程是这样: 调用InnoDB引擎接口取这个表一行,判断ID值是不是10,如果不是跳过如果是则将这行存在结果集中; 调用引擎接口取...“下一行”,重复相同判断逻辑,直到取到这个表最后一行

48220

02 | 基础框架:一条sql查询语句是如何执行_45

但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。 这些资源会在连接断开时候才释放。...比如我们这个例子表 T ,ID 字段没有索引,那么执行器执行流程是这样: 1.调用 InnoDB 引擎接口,存储引擎从硬盘读一页数据,然后取这个表一行(因为这里没有索引,实际上这里是一个全表扫描...,因此这里取实际上是这个表一行数据)返回,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中; 2.调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行。...你会在数据库查询日志中看到一个 rows_examined 字段,表示这个语句执行过程扫描了多少行。这个值就是执行器每次调用引擎获取数据行时候累加。...在有些场景下,执行器调用一次,引擎内部扫描了多行,因此引擎扫描行数跟 rows_examined (row examined 是执行器获取数据行数,不是真正扫描行数)并不是完全相同

1.3K30

2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?

这样当我们碰到 MySQL 一些异常或者问题时,就能够直戳本质,更为快速地定位解决问题。...但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断开时候才释放。...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等等,没关系,我会在后面的文章单独展开说明优化器内容。...比如我们这个例子表 T ,ID 字段没有索引,那么执行器执行流程是这样: 调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中;...调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行

76750

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

因为mysql执行过程临时使用内存是管理连接对象里面的,只有连接断开后,内存再会被释放。...好在mysql提供了“按需使用方式,可将参数query_cache_type设置为DEMAND,这样对于默认sql语句就不适用查询缓存,若指定语句想使用,可用SQL_CACHE显式指定 mysql...* from T where ID=10; 调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10, 如果不是跳过如果是则将这行存在结果集中;调用引擎接口取“下一行”,重复相同判断逻辑...,直到取到这个表最后一行。...在数据库查询日志中看到一个 rows_examined 字段,表示这个语句执行过程扫描了多少行。这个值就是执行器每次调用引擎获取数据行时候累加

60130

一条SQL语句是如何执行

这样能够帮助你从高维度理解问题。当一条SQL语句执行时候,我们看到最后执行结果。却不知道这条语句MySQL内部是如何执行。 总览 所以今天我们把MySQL拆解一下,看看里边有哪些零件。...虽然密码也可以直接跟在 -p 后面写在命令行,但这样可能会导致你密码泄露。如果你连是生产服务器,强烈建议你不要这么做。 连接命令 mysql 是客户端工具,用来跟服务端建立连接。...但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断开时候才释放。...比如我们这个例子表 T ,ID 字段没有索引,那么执行器执行流程是这样: 调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中;...调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行

1.1K50

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

这样当我们碰到 MySQL 一些异常或者问题时,就能够直戳本质,更为快速地定位解决问题。...虽然密码也可以直接跟在 -p 后面写在命令行,但这样可能会导致你密码泄露。如果你连是生产服务器,强烈建议你不要这么做。 连接命令 mysql 是客户端工具,用来跟服务端建立连接。...但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断开时候才释放。...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等等,没关系,我会在后面的文章单独展开说明优化器内容。...调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中; 2. 调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行

54030

MySql基础架构(sql查询语句MySql内部具体是怎么执行?)

较好连接方式长连接产生问题以及解决办法: 全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。...key是查询语句,value是查询值,这样的话查询缓存会直接把value值返回给客户端。查询语句如果步子查询缓存,会正常往下执行,获取到新查询结果后会被存入到查询缓存。...这条查询语句,存储引擎读写数据流程要分两种情况考虑: 表 Student ,ID字段没有索引,执行流程如下: 调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 1,如果不是跳过,...如果是则将这行存在结果集中; 调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行。...第一次调用是“取满足条件一行”这个接口,之后循环取“满足条件一行”这个接口,这些接口都是引擎已经定义好。 总结 到此,一条查询语句mysql架构执行基本流程进行了一个大概讲解。

5.5K20

MySQL(一)基本架构

全部使用长连接时,有时候MySQL占用内存涨得很快,这是因为MySQL执行过程临时使用内存时管理连接对象得,这些资源会在断开连接时才释放,因此如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉...若有权限,打开表继续执行,打开表时候执行器会根据表引擎定义,使用引擎提供接口. mysql> select * from T where ID=10; 表T,ID字段若没有索引,执行器执行流程如下...: 调用InnoDB引擎接口取这个表一行,判断ID值是否为10,若不是跳过,若是则将这行结果存在结果集中....调用引擎接口取下一行重复判断逻辑,直到表最后一行. 执行器将上述遍历所有满足条件行组成记录集作为结果返回给客户端....在数据库查询日志中看到rows_examined字段,表示这个语句执行过程扫描了多少行,这个值是执行器每次调用引擎获取数据行时候累加.

80340

MySQL逻辑架构(1)

这个执行计划表明应该 使用哪些索引 进行查询(全表检索还是使用索引检索),表之间连 接顺序如何,最后会按照执行计划步骤调用存储引擎提供方法来真正执行查询,并将 查询结果返回给用户。...MySQL 8.0.25默认支持存储引擎如下 1.6 存储层 所有的数据,数据库、表定义,表一行内容,索引,都是存在 文件系统 上,以 文件 方式存 完成与存储引擎交互。...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等。后面讲到索引我们再谈。   查询优化器,可以分为 逻辑查询 优化阶段和 物理查询 优化阶段。 4....如果具备权限,就执行 SQL查询返回结果。 MySQL8.0 以下版本,如果设置了查询缓存,这时会将查询结果进行缓存。...1,如果不是跳过如果是则将这行存在结果集中; 调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行

53020

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

这样当我们碰到 MySQL 一些异常或者问题时,就能够直戳本质,更为快速地定位解决问题。...但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断开时候才释放。...如果你还有一些疑问,比如优化器是怎么选择索引有没有可能选择错等等,没关系,我会在后面的文章单独展开说明优化器内容。...比如我们这个例子表 T ,ID 字段没有索引,那么执行器执行流程是这样: 调用 InnoDB 引擎接口取这个表一行,判断 ID 值是不是 10,如果不是跳过如果是则将这行存在结果集中;...调用引擎接口取“下一行”,重复相同判断逻辑,直到取到这个表最后一行

1.5K30

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

建立连接过程通常是比较复杂,建议使用要尽量减少建立连接动作,尽量使用长连接。...但是全部使用长连接后,有时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断 开时候才释放。...比如我们这个例子表 user_info ,id 字段没有索引,那么执行器执行流程是这样: 调用 InnoDB 引擎接口取这个表一行,判断 id 值是不是 1,如果不是跳过如果是则将这行存在结果集中...; 调用引擎接口取下一行重复相同判断逻辑,直到取到这个表最后一行。...数据库查询日志中有 rows_examined 字段,表示这个语句执行过程扫描了多少行。这个值就是执行器每次调用引擎获取数据行时候累加

1.7K30

深入理解SQL原理:一条SQL查询语句是如何执行

建立连接过程通常是比较复杂,建议使用要尽量减少建立连接动作,尽量使用长连接。...但是全部使用长连接后,有时候 MySQL 占用内存涨得特别快,这是因为 MySQL 执行过程临时使用内存是管理连接对象里面的。这些资源会在连接断 开时候才释放。...比如我们这个例子表 user_info ,id 字段没有索引,那么执行器执行流程是这样: 调用 InnoDB 引擎接口取这个表一行,判断 id 值是不是 1,如果不是跳过如果是则将这行存在结果集中...; 调用引擎接口取下一行重复相同判断逻辑,直到取到这个表最后一行。...数据库查询日志中有 rows_examined 字段,表示这个语句执行过程扫描了多少行。这个值就是执行器每次调用引擎获取数据行时候累加

2.6K30

读书笔记--MySQL45讲

没有过滤场景条件下,频繁count查询也会带来相应性能问题,解决思路是使用一张单独表存储数量,当对表进行插入删除操作时,一个事务同时更新数量,这样既保证了数量获取高效,也保证了可重读隔离性正确性...如果不需要加个限制即可,如果需要,有没有可能加一些能缩小数据范围必选条件,然后让整体分页数量不会变很大。...业务上无法搞定,则需要从技术上考虑,慢原因是因为查询了太多不需要数据,那么整体优化思路就是利用覆盖索引,降低回表次数,只最后获取数据时回表查询,也就是延迟关联,如清单1所示: 清单1: 分页优化SQL...,否则还是需要回表获取到对应字段,那么这里查询只会扫描这颗索引树,获取到 m+n个id,丢弃掉m个id,最后再与t表做交集,从而减少回表次数。...MySQL重复读隔离级别下,普通查询是快照读,所以不存在该问题,对于当前读则会存在类似的问题,MySQL解决方法是使用间隙锁,锁住间隙,防止在读取过程其范围内新增合格数据。

96410

一条查询SQLMySQL是怎么执行

这样我们以后遇到MySQL一些异常或者问题时候,就可以快速定位问题解决问题。 下边通过一张图来看一下SQL执行流程,从中可以清楚看到SQL语句MySQL各个功能模块执行过程。 ?...当我们全部使用长连接后,会发现有时候MySQL专用内存涨特别快,这是因为MySQL执行过程临时使用内存是管理连接对象里面的,这些资源会在连接断开时候才释放,所以长时间使用长连接累计下来,可能导致内存占用太大...MySQL提供了query_cache_type参数来设置是否查询缓存,将该参数设置成DEMAND这样对于默认SQL语句都不使用查询缓存,如果确定需要使用查询缓存语句,可以用SQL_CACHE来显式指定...如我们这个例子表T,ID字段没有添加索引,那么执行流程如下: 调用InnoDB引擎接口取这个表一行,判断ID值是不是10,如果不是跳过如果是则将这一行放入结果集中。...调用引擎接口取“下一行”,重复相同判断逻辑,直到这个表最后一行。 执行器将上述遍历过程中所有满足条件行组成一个结果集返回给客户端。 到这里,这个查询SQL就执行完成了。

4.8K20

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

连接器 首先,我们使用 MySQL 数据库时候,是不是必须得连接上它去登录,在这个时候,就是连接器接待我们,它负责和客户端建立连接、获取权限、维持和管理连接操作,一般我们会使用如下命令进行连接:...这个时候有些同学可能就会有疑问,由于 MySQL 执行过程临时使用内存是管理连接对象里面的,如果全部使用长连接的话,有时就会出现 MySql 内存紧张,如果内存占用太大就会出现 OOM ,表现出来就是出现...MySql 收到 select 查询请求之后,他会先去查询缓存组件中看看,看看这条语句之前有没有查询过,如果有被查询过,其会以 key-value 对形式缓存在查询缓存组件内,key 即为查询语句...以我们查询语句为例,现在我们 T 表 ID 字段没有索引,那么,她执行流程是这样: 首先,调用InnoDB引擎接口,取这个表一行,判断ID值是不是10,如果不是跳过如果是则将这行存在结果集中...; 然后,取 “下一行”,重复之前判断逻辑,一直取到这个表最后一行

1K30

explain各字段含义

表示查询使用了两个以上索引, 最后取交集或者集, 常见and ,or条件使用了不同索引...., 对于每个索引键, 表只有一条记录与之匹配. eq_ref和const区别: eq_ref 出现于多表join时, 对于来自前表一行, 在当前表只能找到一行....可以留意下这个列值, 算一下多列索引总长度, 就可知有没有使用到所有的列...., 如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换, 这里可能显示为func 10.rows 非常重要一个字段 mysql估算 需要扫描行数(不是精确值) 通过这个值,可以非常直观地显示...如果没有为ORDER BY使用索引,但是也存在LIMIT子句,优化器可能能够避免使用合并文件,使用内存filesort操作对内存行进行排序。

20641

Mysqls

这样语句数据库明确知道会影响哪一行,它就会使用行锁,当你使用update … where birthday=?这样语句时候因为事先不知道会影响哪些行就可能使用表锁。...这仍然是无须解析查询SQL语句,因为查询缓存已经存放了当前查询需要访问表信息。如果权限没有问题,MySQL跳过所有其他阶段,直接从缓存拿到结果返回给客户端。...静态优化第一次完成后就一直有效,即使使用不同参数重复查询也不会变化,可以认为是一种“编译时优化”。 相反,动态优化查询上下文有关。...例如,要找到一列最小值,只需要查询对应B-tree索引最左端记录,MySQL可以直接获取索引一行记录。...结果集中一行都会以一个满足MySQL客户端/服务器通信协议封包发送,再通过TCP协议进行传输,TCP传输过程可能MySQL封包进行缓存然后批量传输。

65800
领券