mysql、pg的sql请求处理流程

mysql的sql请求处理流程

连接器

  • 客户端发起 SQL 查询请求时,首先会经过连接器模块。
  • 连接器模块负责管理客户端与服务器端之间的 TCP/IP 连接。
  • 它会验证用户身份,如果认证通过,就建立连接并分配相应的线程资源。

授权器

  • 连接成功后,授权器模块会根据用户权限,检查当前用户是否有执行该 SQL 语句的权限。
  • 如果没有权限,就会返回权限错误的信息给客户端。

查询缓存

  • 如果查询权限校验通过,MySQL 会先检查查询缓存。
  • 查询缓存是一个内存区域,用于存储之前执行过的 SQL 语句及其结果。
  • 如果之前执行过完全一样的查询,MySQL 会直接返回缓存的结果,无需再次执行。

分析器

  • 如果查询缓存未命中,MySQL 会进入分析器阶段。
  • 分析器会对 SQL 语句进行词法分析和语法分析,生成一颗语法树。
  • 语法树描述了 SQL 语句的逻辑结构,为后续的优化和执行提供基础。

优化器

  • 分析器生成语法树后,会交由优化器进行查询优化。
  • 优化器会根据表的统计信息,比如索引、数据分布等,选择最优的执行计划。
  • 优化器会考虑各种优化策略,比如索引选择、表连接顺序等,选择成本最低的执行计划。

执行器

  • 有了优化后的执行计划,就进入执行器阶段。
  • 执行器负责调用存储引擎,按照执行计划进行查询。
  • 执行器根据语法树,一步步地将查询结果返回给客户端。

存储引擎

  • 执行器会调用存储引擎进行具体的数据读写操作。
  • 不同的存储引擎有不同的特点,InnoDB 是 MySQL 默认的存储引擎。
  • 存储引擎负责数据的存储和读取,包括缓存、索引、事务等。

PostgreSQL 的 SQL 处理流程

连接建立

  • 客户端发起连接请求时,PostgreSQL 的网络层模块会接收请求,建立与客户端的 TCP 连接。
  • 连接建立后,客户端会发送认证信息,比如用户名和密码,由认证模块进行验证。

查询解析

  • 客户端发送 SQL 查询后,查询解析器会对 SQL 语句进行词法分析和语法分析,生成一颗查询树。
  • 查询树描述了 SQL 语句的逻辑结构,为后续的查询优化和执行提供依据。

查询优化

  • 优化器模块会根据查询树,结合数据库的统计信息(如索引、数据分布等),选择最优的执行计划。
  • 优化器会考虑多种优化策略,如索引选择、连接顺序、聚合方式等,选择成本最低的执行计划。

查询执行

  • 有了优化后的执行计划,就进入执行器阶段。
  • 执行器负责调用存储引擎,按照执行计划进行具体的数据读写操作。
  • 执行器根据查询树,一步步地执行查询,最终返回查询结果给客户端。

存储引擎

  • PostgreSQL 有自己独有的存储引擎,负责数据的存储和读取。
  • 存储引擎提供了如索引、事务、并发控制等核心功能。
  • 不同的存储引擎有不同的特点,PostgreSQL 默认使用 PostgreSQL 存储引擎。

缓存管理

  • PostgreSQL 拥有强大的缓存管理机制,包括共享缓冲区缓存、查询缓存等。
  • 缓存管理模块会根据数据访问模式,自动管理数据页的缓存,提高查询效率。

日志记录

  • PostgreSQL 会记录各种日志信息,如查询日志、事务日志等,用于审计和故障诊断。
  • 日志记录模块负责管理这些日志信息,确保数据的安全性和可靠性。

MySQL 的缓存机制

查询缓存(Query Cache)

  • MySQL 会缓存已执行的查询以及其结果,下次执行相同查询时直接返回缓存结果。
  • 查询缓存受 query_cache_size 和 query_cache_type 参数控制。
  • 只有完全一致的查询才能命中查询缓存,对于参数不同或者表结构变更的查询,缓存就不会命中。

表缓存(Table Cache)

  • MySQL 会缓存打开的数据表结构和索引信息,减少打开表的开销。
    表缓存受 table_open_cache 参数控制。
  • 当打开的表超过缓存大小时,MySQL 会自动关闭一些不常用的表。

索引缓存(Index Cache)

  • MySQL 会缓存最近访问的索引页,加快索引查找速度。
  • 索引缓存受 innodb_buffer_pool_size 参数控制。

缓冲池(Buffer Pool)

  • InnoDB 引擎会将最近访问的数据页缓存在缓冲池中,减少磁盘 I/O。
  • 缓冲池大小受 innodb_buffer_pool_size 参数控制。

查询执行缓存

  • MySQL 会缓存查询的执行计划,下次执行相同查询时直接复用。
  • 这种缓存在 MySQL 8.0 中得到了加强。

总的来说,MySQL 的缓存机制主要包括查询缓存、表缓存、索引缓存和缓冲池等,可以显著提升查询性能。不同版本的 MySQL 在缓存机制上也有一些差异。

PG的缓存机制

PostgreSQL 确实拥有强大的缓存机制,以提高查询性能。主要包括以下几种缓存:

共享缓冲区缓存

  • PostgreSQL 会将最近访问的数据页缓存在共享内存区域,提高后续对这些数据的访问速度。
  • 共享缓冲区大小可以通过 shared_buffers 参数进行配置。

查询缓存

PostgreSQL 会缓存最近执行的查询和其结果,以便后续执行相同查询时快速返回结果。
查询缓存的行为受 enable_seqscan、enable_indexscan 等参数的控制。

操作系统缓存

  • PostgreSQL 在读写磁盘数据时,会利用操作系统的页缓存机制,进一步提高访问速度。
  • 操作系统缓存的行为受 effective_cache_size 参数的影响。

索引缓存

  • PostgreSQL 会缓存最近访问的索引页,加快索引查找速度。
  • 索引缓存的效果受 maintenance_work_mem 参数的影响。

元数据缓存

  • 包括表结构、约束、统计信息等元数据的缓存,减少元数据查找开销。

不同点

缓存机制的不同

MySQL 的缓存机制

  • MySQL 会先检查查询缓存,如果命中缓存则直接返回结果,不需要经过解析、优化和执行等步骤。
  • 只有当查询缓存未命中时,才会进入查询解析、优化和执行的流程。

PostgreSQL 的缓存机制

  • PostgreSQL 的处理流程是先进行查询解析、优化和执行,然后再查询各种缓存(共享缓冲区缓存、查询缓存等)。
  • 无论是否命中缓存,PostgreSQL 都会经历完整的查询处理流程。缓存只是在执行阶段起作用。
  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherry Xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值