首页
学习
活动
专区
工具
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 为什么要这么设计?

    93420

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

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

    50920

    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,如果不是则跳过,如果是则将这行存在结果集中;...调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

    78450

    一条SQL语句是如何执行的?

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

    1.1K50

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

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

    62330

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

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

    56730

    一条SQL是怎么执行的

    server during query) # 当连接成功后连接器会从权限表中查询当前连接用户所拥有的权限,如果在连接过程中被授予了新的权限并不会当即更新 # 因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的...,所以在有多个长连接线程时服务器的内存占用会很高,此时最好可以定时断开后重连缓存器 -> 用于缓存查询结果,下次执行SQL语句如果命中缓存则直接返回查询结果(MySQL8中已经废除了这个功能)...# 当MySQL在内存缓存(你可以把它们理解key-value)中获取到SELECT语句执行结果则会直接返回结果给客户端而不在执行后续过程 # 你可以使用 show variables like...单列,组合索引)时决定使用哪个索引,或者语句中出现多个表关联时决定各个表的连接顺序 执行器 -> 用于操作存储引擎获取最终查询结果 # 在经过分析器知道要干什么及优化器知道要怎么干后执行器首先会判断这个连接用户对这些要查询的表有没有操作权限...# 调用存储引擎的接口取这个表的第一行 # 判断id如果是100则将这行加入结果集,不是则跳过 # 重复这个逻辑直到最后一行(你可以在explain

    6110

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

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

    5.6K20

    MySQL逻辑架构(1)

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

    55120

    MySQL(一)基本架构

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

    83040

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

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

    1.5K30

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

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

    1.8K30

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

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

    2.8K30

    读书笔记--MySQL45讲

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

    99210

    一条查询SQL在MySQL中是怎么执行的

    这样在我们以后遇到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,如果不是则跳过,如果是则将这行存在结果集中...; 然后,取 “下一行”,重复之前的判断逻辑,一直取到这个表的最后一行。

    1.1K30

    Mysqls

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

    67500
    领券