Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql的三层体系结构

mysql的三层体系结构

原创
作者头像
Kami米雅
发布于 2021-12-10 02:04:15
发布于 2021-12-10 02:04:15
1.2K0
举报
文章被收录于专栏:上云服务专题上云服务专题

Mysql:是单进程多线程数据库

层名称

作用

处理网络链接层

连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理、授权认证、安全等。

SQL处理层

也叫MySQL服务器层,包括缓存查询、解析器、优化器,这一部分是MySQL核心功能,包括解析、优化SQL语句,查询缓存目录,内置函数(日期、时间、加密等函数)的实现

存储引擎层

负责数据存储,存储引擎的不同,存储方式、数据格式、提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的。但是,与分层的思想一致,SQL处理层是通过API与存储引擎通信的,API屏蔽了下层的差异,下层提供对外接口,上层负责调用即可,不必清楚下层是怎么实现的。

第1层网络连接层介绍:网络连接层主要有连接池和线程池。

mysql的连接管理方式:

Mysql-Server同时支持3种连接管理方式,包括No-Threads,One-Thread-Per-Connection和Pool-Threads。No-Threads:表示处理连接使用主线程处理,不额外创建线程,这种方式主要用于调试;One-Thread-Per-Connection:是线程池出现以前最常用的方式,为每一个连接创建一个线程服务;Pool-Threads:则是线程池方式。

为什么有连接池和线程池?

每创建一个新的会话(或链接),mysql内部创建一个新的用户线程来提供服务,当连接被销毁,线程也被销毁.即一个连接有一个线程.这种创建链接和销毁链接都会消耗cpu性能.为了降低这种消耗,有了连接池和线程池.

连接池和线程池说明:

连接池主要用来管理客户端的连接,避免重复的连接/断开操作,是将空闲的连接缓存起来,可以复用。从而减少了连接mysql server/断开mysql server的开销与成本,从而提升性能。但是mysql的连接池不能获取mysql server的查询处理能力以及当前的负载情况。线程池:线程池的操作是在mysql server端,并且设计就是用来管理当前并发的连接和查询。

thread pool到底能够提升多少性能?

根据Oracle Mysql官方的性能测试:在并发达到128个连接以后.没有线程池的Mysql性能会迅速降低。使用线程池以后,性能不会出现波动,会一直保持在较好的状态运行。在读写模式下,128个连接以后,有线程池的Mysql比没有线程池的Mysql性能高出60倍。在只读模式下,512个连接以后,有线程池的Mysql比没有线程池的Mysql性能高出18倍。

什么时候可以考虑使用thread_pool?

show global status like '%threads_running%';其值是mysql server当前并发执行语句的数量,如果这个值一直保持在40左右的区间,那么可以考虑使用thread pool。如果你使用了innodb_thread_concurrency参数来控制并发的事物量,那么使用线程池将会获得更好的效果。如果你的工作是有很多短连接组成的,那么使用线程池是有益的。

第2层sql处理层(SQL Layer):主要有SQL Interface、Parser、Optimizer、Cache和Buffer

Sql层功能:

功能:解析器,授权,优化器,查询执行,查询高速缓存,查询日志记录,跨存储引擎功能。1.解析器:解析SQL语法,形成语法树2.授权:SQL的权限验证  *.*对于指定的库和表3.优化器:CBO(基于成本的优化),根据统计信息--> SQL改写 --->执行计划(即选哪种算法执行)

sql层处理数据流程:

用户传入sql-----查询缓存(命中缓存可直接返回结果)----解析器(生成sql解析树)----预处理器(可能sql等价改写)-----查询优化器(生成sql执行计划)----查询执行引擎----结果返回给用户。

SQL接口:(SQL Interface)

功能:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

解析器:(Parser)--生成sql解析树

SQL命令传递到解析器的时候会被解析器验证和解析(进行语义和语法的分析,分解成数据结构,如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 ),生成sql解析树。解析器是由Lex和YACC实现的,是一个很长的脚本。

查询优化器:(Optimizer) --生成执行计划

SQL语句在查询之前会使用查询优化器对查询进行优化,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果,即执行计划。查询优化器使用选取-投影-联接策略生成执行计划。

选取-投影-联接:

用一个例子就可以理解: select uid,name from user where gender = 1;这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤。这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤。将这两个查询条件联接起来生成最终查询结果。

查询缓存功能(Cache和Buffer):(建议关闭)

当执行sql的时候,sql第一次被执行,然后再次执行的时候如果相同的sql,可以不进行解析,直接返回结果,提高查询效率.关闭查询缓存:query_cache_type = 0    query_cache_size = 0局限性比较大,任何查询结果有变更,都需要进行更新,对于mysql性能影响比较严重,整个更新过程的锁颗粒度的比较高,还持有全局锁,效率很低.建议:是否使用查询缓存,不用.(在mysql8.0里没了查询缓存功能.)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SqlAlchemy 2.0 中文文档(十八)
本节介绍了有关加载列的其他选项。使用的映射包括将存储大字符串值的列,我们可能希望限制它们何时加载。
ApacheCN_飞龙
2024/06/26
4440
SqlAlchemy 2.0 中文文档(八十一)
本文档描述了 SQLAlchemy 版本 0.3(2007 年 10 月 14 日最后发布)与 SQLAlchemy 版本 0.4(2008 年 10 月 12 日最后发布)之间的变化。
ApacheCN_飞龙
2024/08/26
2400
SqlAlchemy 2.0 中文文档(十九)
SQLAlchemy 的一个重要部分是在查询时提供对相关对象加载方式的广泛控制。所谓“相关对象”是指在映射器上使用relationship()配置的集合或标量关联。这种行为可以在映射器构造时使用relationship()函数的relationship.lazy参数进行配置,以及通过使用ORM 加载选项与Select构造函数一起使用。
ApacheCN_飞龙
2024/06/26
5620
SqlAlchemy 2.0 中文文档(二十一)
本页包含了由 Python 生成的Query构造的文档,多年来这是与 SQLAlchemy ORM 一起使用时的唯一 SQL 接口。从版本 2.0 开始,现在采用的是全新的工作方式,其中与 Core 相同的select()构造对 ORM 同样有效,为构建查询提供了一致的接口。
ApacheCN_飞龙
2024/06/26
9550
SqlAlchemy 2.0 中文文档(十二)
邻接列表模式是一种常见的关系模式,其中表包含对自身的外键引用,换句话说是自引用关系。这是在平面表中表示层次数据的最常见方法。其他方法包括嵌套集,有时称为“修改的先序”,以及材料路径。尽管在 SQL 查询中评估其流畅性时修改的先序具有吸引力,但邻接列表模型可能是满足大多数层次存储需求的最合适模式,原因是并发性、减少的复杂性,以及修改的先序对于能够完全加载子树到应用程序空间的应用程序几乎没有优势。
ApacheCN_飞龙
2024/06/26
3740
SqlAlchemy 2.0 中文文档(八)
将相对简单的 SQL 表达式链接到类的最简单和最灵活的方法是使用所谓的“混合属性”,在 混合属性 部分中描述。混合提供了一个同时在 Python 级别和 SQL 表达式级别工作的表达式。例如,我们将一个类 User,其中包含属性 firstname 和 lastname,映射到下面一个混合,该混合将为我们提供 fullname,即这两者的字符串连接:
ApacheCN_飞龙
2024/06/26
3800
SqlAlchemy 2.0 中文文档(七十二)
本文描述了 SQLAlchemy 版本 1.3 和 SQLAlchemy 版本 1.4 之间的变化。
ApacheCN_飞龙
2024/08/26
1.1K0
SqlAlchemy 2.0 中文文档(十)
映射器可以构造与任意关系单元(称为 selectables)相对应的类,除了普通表之外。例如,join() 函数创建了一个包含多个表的可选择单元,具有自己的复合主键,可以与 Table 相同的方式映射:
ApacheCN_飞龙
2024/06/26
5430
SqlAlchemy 2.0 中文文档(七十八)
本文档描述了 SQLAlchemy 版本 0.7(截至 2012 年 10 月正在进行维护发布)和 SQLAlchemy 版本 0.8(预计于 2013 年初发布)之间的更改。
ApacheCN_飞龙
2024/08/26
3420
SqlAlchemy 2.0 中文文档(五十五)
numpy包具有其自己的数字数据类型,它们是从 Python 的数字类型扩展而来的,但是其中包含一些行为,在某些情况下使它们无法与 SQLAlchemy 的一些行为以及使用的底层 DBAPI 驱动程序的一些行为协调一致。
ApacheCN_飞龙
2024/08/01
7270
SqlAlchemy 2.0 中文文档(十一)
本节描述了relationship()函数及其用法的深入讨论。关于关系的介绍,请从使用 ORM 相关对象开始,参阅 SQLAlchemy 统一教程。
ApacheCN_飞龙
2024/06/26
3950
SqlAlchemy 2.0 中文文档(五十六)
对于 SQLAlchemy 2.0,有两个单独的文档;"主要迁移指南"详细介绍了如何将 SQLAlchemy 1.4 应用程序更新为兼容 SQLAlchemy 2.0。"有什么新内容?"文档详细介绍了 SQLAlchemy 2.0 中的主要新功能、功能和行为。
ApacheCN_飞龙
2024/08/01
6780
SqlAlchemy 2.0 中文文档(三十三)
“index”表示属性与具有预定义索引以访问它的Indexable列的元素相关联。Indexable类型包括ARRAY、JSON和HSTORE等类型。
ApacheCN_飞龙
2024/06/26
6660
SqlAlchemy 2.0 中文文档(三十三)
SqlAlchemy 2.0 中文文档(三十一)
1.4 版本更改:绝大部分声明式扩展现在已整合到 SQLAlchemy ORM 中,并可从 sqlalchemy.orm 命名空间导入。请参阅声明式映射的文档以获取新文档。有关更改的概述,请参阅声明式现已与 ORM 整合,并带有新功能。
ApacheCN_飞龙
2024/06/26
7690
SqlAlchemy 2.0 中文文档(七十七)
本文档描述了 SQLAlchemy 版本 0.8 与版本 0.9 之间的变化,截至 2013 年 5 月,0.8 版本正在进行维护,而 0.9 版本在 2013 年 12 月 30 日首次发布。
ApacheCN_飞龙
2024/08/26
3170
SqlAlchemy 2.0 中文文档(二十七)
AttributeState对象通过特定InstanceState的InstanceState.attrs集合访问:
ApacheCN_飞龙
2024/06/26
6250
SqlAlchemy 2.0 中文文档(七十三)
本文描述了 SQLAlchemy 版本 1.2 和 SQLAlchemy 版本 1.3 之间的更改。
ApacheCN_飞龙
2024/08/26
5160
SqlAlchemy 2.0 中文文档(十五)
这是一种非常特殊的情况,其中 relationship()必须执行一个 INSERT 和一个第二个 UPDATE,以正确填充一行(反之亦然,为了删除而执行一个 UPDATE 和 DELETE,而不违反外键约束)。这两种用例是:
ApacheCN_飞龙
2024/06/26
4990
SqlAlchemy 2.0 中文文档(三十二)
orderinglist是一个用于可变有序关系的辅助程序。它将拦截对由relationship()管理的集合执行的列表操作,并自动将列表位置的更改同步到目标标量属性。
ApacheCN_飞龙
2024/06/26
5060
SqlAlchemy 2.0 中文文档(五十七)
SQLAlchemy 2.0 的过渡文档分为 两个 文档 - 一个详细说明了从 1.x 到 2.x 系列的主要 API 转换,另一个详细说明了与 SQLAlchemy 1.4 相关的新功能和行为:
ApacheCN_飞龙
2024/08/01
7140
相关推荐
SqlAlchemy 2.0 中文文档(十八)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档