当前位置: 首页 > news >正文

爱站网长尾关键词挖掘工具网站设计流行趋势

爱站网长尾关键词挖掘工具,网站设计流行趋势,深圳ccd设计公司官网,美食网站建设设计方案目录 四 . 基础架构#xff1a;一条SQl查询语句是如何执行的#xff1f; 4.1 MySQL逻辑架构图#xff1a; 4.2 MySQL的Server层和存储引擎层 4.2.1 连接器 4.2.1.1 解释 4.2.1.2 MySQL 异常重启 解决方案#xff1a; 4.2.1.2.1. 定期断开长连接#xff1a; 4.2.1.2.2. 初始… 目录 四 . 基础架构一条SQl查询语句是如何执行的  4.1 MySQL逻辑架构图 4.2 MySQL的Server层和存储引擎层 4.2.1 连接器 4.2.1.1 解释 4.2.1.2 MySQL 异常重启 解决方案 4.2.1.2.1. 定期断开长连接 4.2.1.2.2. 初始化资源 4.2.2 查询缓存 4.2.2.1 解释 4.2.2.2 解释大部分情况下建议不要使用查询缓存 4.2.3 分析器 4.2.4 优化器 4.2.4.1 例子 4.2.4.2表的连接顺序优化 详细解释 4.2.4.2.1 优化效果 4.2.4.2.1 .1内存占用 4.2.4.2.1.2磁盘IO开销 4.2.5 执行器  4.2.5.1 解释 4.2.5.2 T表中ID没有索引 4.2.5.4 有无索引的查询详细解释 4.2.5.5 rows_examined 详细解释 四 . 基础架构一条SQl查询语句是如何执行的 我们进行整体的分析从MySQL的基础架构进行分析。 如我们看到这个查询语句: mysql select * from T where ID10我们只能看到输入的一条语句返回的结果但是却不知道这条语句在MySQL内部的执行过程。 4.1 MySQL逻辑架构图 客服端 MySQL可以Server层和存储引擎两部分。 4.2 MySQL的Server层和存储引擎层 Server层 包括连接器查询缓存分析器优化器执行器等Server层还提供了许多内置函数例如日期、时间、数学和加密函数等用于方便地进行数据处理和计算Server层实现的功能不依赖于具体的存储引擎因此可以在不同的存储引擎之间共享和使用这些功能包括存储过程、触发器、视图等它们可以跨存储引擎使用为数据库提供了更强大和灵活的功能。 详细解释 存储过程、触发器和视图是数据库中的重要功能它们可以在数据操作和管理中提供更高级的逻辑和灵活性。 存储过程是一段预定义的代码块可以被调用执行。它允许开发人员将一系列的SQL语句和逻辑组织起来形成一个可重复使用的模块。通过存储过程可以降低网络通信的开销、提高性能并且可以实现复杂的业务逻辑。 触发器是与表相关联的特殊类型的存储过程。它可以在指定的事件例如插入、更新或删除数据发生时自动触发执行一段代码。触发器允许我们在数据的变动发生时对其进行额外的处理实现数据完整性约束、审计跟踪等功能。 视图是虚拟的表是根据查询语句的结果集创建的。它为用户提供了一种简化和抽象的方式来访问和操作数据隐藏了底层表的复杂性。通过视图我们可以实现数据的安全性控制只显示部分字段、数据的逻辑组织合并多个表的数据以及简化复杂的查询操作。 因为存储过程、触发器和视图等功能在数据库中扮演着重要的角色并能提供更高级的数据处理和管理能力所以被包括在MySQL的Server层中以便跨存储引擎统一实现和使用。 存储引擎层 负责数据的存储和提取。其架构模式是插件式的支持InnoDBMyISAMMemory等多个存储引擎。目前最常用的引擎是InnoDB从MySQL 5.5.5版本开始成为了默认存储引擎。 例子 当我们执行create table 建表的时候我们不进行指定引擎类型默认使用的就是InnoDB。 不同的存储引擎共用一个Server层也就是从连接器到执行器的部分下面将会进行一遍执行流程的讲解依次看每个组件的作用。 4.2.1 连接器 4.2.1.1 解释 我们一开始将会先进行连接到这个数据库上这时候第一个接待你的就是连接器连接器负责与客服端建立连接获取权限维持和管理连接。 连接命令 mysql -h$ip -P$port -u$user -p 输入命令后我们将需要在交互对话中输入密码。 也可以直接在-p后写直接放到命令行但是这样可能会导致密码泄露尤其是连接的生产服务器。 连接命令中的mysql是客户端的工具用来跟服务器建立连接。在进行经典的TCP握手后连接器将进行认证身份使用的是用户名和密码。 不正确的话会收到Access denied for user的错误然后客户端程序结束如果正确的话连接器将会进入到权限表中查询你拥有的权限之后的连接里面的权限判断逻辑都依赖此时读到的权限。 即使用管理员账号对这个用户进行了权限修改也不会影响已经存在连接的权限。 修改完成后只有再新建的连接才会使用新的权限设置。 连接完成后如果你没有后续的动作这个连接就处于空闲状态你可以在 show processlist 命令中看到它。文本中这个图是 show processlist 的结果其中的 Command 列显示为 “Sleep”的这一行就表示现在系统里面有一个空闲连接 客户端如果太长时间没动静连接器就会自动将它断开。这个时间是由参数 wait_timeout 控 制的默认值是 8 小时。 如果在连接被断开之后客户端再次发送请求的话就会收到一个错误提醒 Lost connection to MySQL server during query。这时候如果你要继续就需要重连然后再执 行请求了。 数据库里面长连接是指连接成功后如果客户端持续有请求则一直使用同一个连接。短连 接则是指每次执行完很少的几次查询就断开连接下次查询再重新建立一个。 建立连接的过程通常是比较复杂的建议在使用中要尽量减少建立连接的动作也就 是尽量使用长连接。 但是全部使用长连接后你可能会发现有些时候 MySQL 占用内存涨得特别快这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时 候才释放。所以如果长连接累积下来可能导致内存占用太大被系统强行杀掉OOM 从现象看就是 MySQL 异常重启了。 4.2.1.2 MySQL 异常重启 解决方案 4.2.1.2.1. 定期断开长连接 使用一段时间后或者程序里面判断执行过一个占用内存的大查询后断开连接之后再查询重连。 4.2.1.2.2. 初始化资源 如果是MySQL5.7以上版本我们可以再执行一个比较大的操作后通过执行mysql_reset_connection来进行初始化连接资源。过程不需要重连和重新做权限验证但是会将连接恢复到刚刚创建完时的状态。 4.2.2 查询缓存 4.2.2.1 解释 连接建立完毕后我们可以进行执行select语句执行逻辑就会来到第二步查询缓存 MySQL 拿到一条语句的时候会先到查询缓存里面看看看之前是不是执行过这条语句。 之前执行过的语句及其结果可能会以key-value对的形式被直接缓存在内存中。 key是查询语句value是查询结果如果查询能直接在这个缓存里面找到Key那么这个value就会被直接返回到客户端。 如果语句不在查询缓存中就会继续后面的执行阶段。执行完成后执行结果会被存入查询缓存中如果查询命中缓存MySQL不需要执行后面的复杂操作可以直接返回结果效率很高。 4.2.2.2 解释大部分情况下建议不要使用查询缓存 查询缓存的失效非常频繁只要有对一个表的更新这个表上所有的查询缓存都会被清空。因 此很可能你费劲地把结果存起来还没使用呢就被一个更新全清空了。 对于更新压力大的数据库来说查询缓存的命中率会非常低。除非你的业务就是有一张静态表很长时间才会更新一次。比如一个系统配置表那这张表上的查询才适合使用查询缓存。 详细解释 当对一个表进行更新操作时包括插入、删除、修改等该表上所有的查询缓存都会被清空。这意味着即使之前有查询结果被缓存起来了但只要有更新操作所有的缓存都会被清空。 这样的缓存失效机制导致了查询缓存命中率的降低尤其是在更新压力大的数据库环境下。如果数据库经常有更新操作那么查询缓存很可能无法发挥作用因为缓存的结果很快就会被清空需要重新执行查询。 因此查询缓存更适合应用于静态表或者更新频率较低的表。比如系统配置表这种很长时间才会更新一次的表查询缓存可以有效地提高查询性能因为缓存的结果可以长时间保持有效避免频繁的查询操作。 我们可以在MySQL中将参数query_cache_type设置成为demand这样对于默认的SQL语句都不在使用查询缓存。 对于你想要进行查询缓存的语句可以使用SQL_cache 显式指定 例子 mysql select SQL_CACHE * from T where ID10 注意 MySQL 8.0版本直接将查询缓存整块功能进行删掉8.0开始就没有这个功能了。 4.2.3 分析器 如果没有命中查询缓存我们就会进行真正的执行语句。 首先MySQL需要知道你要做什么所以会对SQL语句进行解析。 词法分析 输入的是多个字符串和空格组成的一条SQL语句MySQL需要识别里面的字符串分别是什么代表什么MySQL从你输入的select这个关键字识别出来这是一个查询语句。它也要把字符串“T” 识别成“表名 T”把字符串“ID”识别成“列 ID”然后下一步将是语法分析。 语法分析 根据词法分析的结果语法分析器会根据语法规 则判断你输入的这个 SQL 语句是否满足 MySQL 语法。 如果你的语句不对就会收到“You have an error in your SQL syntax”的错误提醒比如 下面这个语句 select 少打了开头的字母“s” mysql elect * from t where ID1; ERROR 1064 (42000): You have an error in your SQL syntax; 一般语法错误提示将会进行提示第一个错误的位置。  4.2.4 优化器 经过分析器后MySQL就知道你要做什么了在开始执行之前我们还要进行优化器的处理优化器是在表里面有多个索引的时候决定采用哪一个索引或者在一个语句有多表关联join的时候决定各个表的连接顺序。 4.2.4.1 例子 SELECT * FROM A INNER JOIN B ON A.id B.user_idWHERE A.name John AND B.address 123 Street;优化器会根据查询语句和表的索引来确定使用哪个索引和连接顺序。 首先优化器会考虑过滤条件。在这个查询中我们有两个过滤条件A.name John 和 B.address 123 Street。其中A.name John 使用了表A的列name并且表A上有一个名为idx_name的索引因此优化器可能会选择使用idx_name索引来加速查询。 接下来优化器会考虑连接顺序。在这个查询中我们有一个INNER JOIN操作连接条件是A.id B.user_id。优化器会分析表A和表B之间的关系以及它们的大小、索引等信息然后决定连接顺序。 假设表A比表B小那么优化器可能会选择先读取表A然后根据连接条件A.id B.user_id来获取匹配的行。由于A.id和B.user_id都没有索引优化器可能会执行全表扫描来进行连接操作。 但如果表A非常大而表B非常小并且idx_user_id索引在表B上能够更好地支持连接操作那么优化器可能会选择先读取表B并使用idx_user_id索引来快速定位匹配的行。然后再根据连接条件A.id B.user_id来获取表A中的相应行。 在多表关联的查询中优化器会通过分析查询语句、表的大小和索引等信息来决定使用哪个索引以及表的连接顺序。这样可以最大程度地提高查询性能和效率。 4.2.4.2表的连接顺序优化 详细解释 多表关联查询中选择先读取较小的表并根据连接条件获取匹配的行。 4.2.4.2.1 优化效果 4.2.4.2.1 .1内存占用 通过先读取较小的表可以使得该表的数据能够完全加载到内存中。这样在进行连接操作时只需要保留相对较小的表的数据和相关索引可以减少内存占用。而如果先读取较大的表则可能需要将较大表的数据逐步加载到内存中会占用更多的内存资源。 4.2.4.2.1.2磁盘IO开销 通过先读取较小的表可以减少磁盘IO次数。当进行连接操作时需要根据连接条件在两个表之间进行数据匹配。如果先读取较小的表并使用连接条件过滤出匹配的行可以减少后续连接操作所需处理的数据量。而如果先读取较大的表则可能需要处理更多的数据行导致磁盘IO开销增加。 4.2.5 执行器  4.2.5.1 解释 MySQL通过分析器知道SQl语句要做什么通过优化器知道了应该怎么做最优然后进行执行器开始执行语句。 开始执行的时候将会先进行判断你对这个表T有没有执行查询权限的权限没有的话就会返回没有权限的错误如果进行了命中缓存我们将在查询缓存返回结果的时候进行权限验证。 查询也会在优化器之前调用 precheck 验证权限)。 mysql select * from T where ID10; ERROR 1142 (42000): SELECT command denied to user blocalhost for table T 如果具有权限我们就打开表继续执行打开表的时候执行器将会根据表的引擎定义使用引擎提供的接口。 4.2.5.2 T表中ID没有索引 我们执行器的执行流程就是 1.调用 InnoDB 引擎接口取这个表的第一行判断 ID 值是不是 10如果不是则跳过如果 是则将这行存在结果集中 2. 调用引擎接口取“下一行”重复相同的判断逻辑直到取到这个表的最后一行。 3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 至此语句就结束了。 4.2.5.3 有索引的表 则是 第一次调用的是“取满足条件的第一行”这个接口 之后循环取“满足条件的下一行”这个接口这些接口都是引擎中已经定义好的。 4.2.5.4 有无索引的查询详细解释 有无索引对执行器的执行流程和性能有着重要影响。索引是一种数据结构用于提高数据库查询操作的速度和效率。在有无索引的情况下执行器的执行流程会有所区别。 无索引的表 执行器会依次读取表中的每一行数据并判断ID值是否为10。如果ID不是10则跳过该行继续读取下一行。如果ID是10则将该行数据添加到结果集中。执行器会持续循环这个过程直到遍历完整个表。由于没有索引的支持无索引的表需要逐行扫描并判断条件这称为全表扫描。这种方式在数据量大的情况下性能较差因为需要消耗更多的IO和处理资源。 有索引的表 执行器会使用索引来加速查询。根据索引的定义和查询条件执行器可以快速定位满足条件的第一行数据。之后执行器会通过引擎接口获取满足条件的下一行数据直到达到查询结果的要求或遍历完索引。有索引的表可以利用索引进行快速定位和筛选数据避免全表扫描。这样可以大幅提高查询性能减少IO开销和资源消耗。索引可以根据查询条件的列或列组合来创建以支持特定的查询操作。 有无索引对执行器的执行流程和性能有显著影响。无索引的表需要逐行扫描并判断条件而有索引的表可以利用索引快速定位和筛选数据。通过合适地创建和使用索引可以大幅提高数据库查询的效率。 最后我们可以在数据库慢查询日志中看到一个rows_examined的字段表示语句执行过程中扫描了多少行这个值就是执行器每次调用引擎获取数据行的时候累加的。 在有些场景下执行器调用一次在引擎内部则扫描了多行因此引擎扫描行数跟 rows_examined 并不是完全相同的。 4.2.5.5 rows_examined 详细解释 在某些查询场景下执行器可能需要扫描多行数据才能完成查询操作。这是因为查询可能需要访问多个表或者涉及复杂的查询条件执行器需要逐行扫描这些数据以便找到满足查询条件的结果集。可能会出现以下情况 聚合查询当执行聚合查询例如 SUM、COUNT、AVG时执行器需要扫描多行数据并对其进行计算以得出最终的聚合结果。 连接查询当执行连接查询例如使用 JOIN 操作符连接多个表时执行器需要扫描多行来匹配连接条件并返回满足条件的结果。 子查询当执行包含子查询的语句时在子查询执行过程中可能需要扫描多行数据并将结果传递给外部查询。 这意味着在某些查询场景下执行器可能需要扫描多行数据以便完成所需的操作而不仅仅是返回给用户的结果集所包含的行数。 在执行器返回结果集时引擎会将实际扫描的行数汇总为 rows_examined 并返回给用户。因此rows_examined 是评估查询性能和优化查询计划的指标之一。如果 rows_examined 远大于实际所需的行数那么可能需要进一步考虑优化查询条件、添加索引或调整表结构等方法来提高查询性能。
http://www.dnsts.com.cn/news/194745.html

相关文章:

  • 网站海报是怎么做的做机网站
  • 网站服务器和空间有没有做软件的外包网站
  • 查看网站开发鞍山网站建设企业
  • 自己做付费网站义乌多语言网站建设
  • 成都网站建设培训学校祥云平台做网站好不好
  • 京东网站建设设计框架图如何在网上做网站推广
  • 找人做淘宝网站需要多少钱福田做商城网站建设哪家效益快
  • 上海网站建设代码萧涵wordpress主题
  • 顺德网站开发怎么做领券网站
  • 广州万网建网站南昌市住房和城乡建设网站
  • 做动态图片的网站长沙建一个网站多少钱
  • 微商城网站建设网站制作好后 怎样上线
  • 互联网推广网站建设网页游戏挂机软件
  • 网站建设类论文格式脑卒中中心建设网站
  • 如何利用开源代码做网站石家庄seo网站优化电话
  • 十堰网站建设哪家专业青海城乡建设厅网站 官网
  • 网站标题关键词中国响应式网站案例
  • 求一外国h网站网站设计开发软件
  • 个人网站模板响应式wordpress地址怎么找回
  • 网站空间费用福州开发公司
  • 萧山做网站设计网络广告营销的概念
  • 重庆网站推广人员亚马逊网站
  • 做直播导航网站好本地搭建linux服务器做网站
  • 旅游网站模板文章wordpress+弹窗打开
  • 江西营销型网站建设h5 建站网站 移动端
  • 网站设计公司 -wordpress如何导入数据库
  • 站长素材网app免费下载网站和网址的区别
  • 网站搭建好显示建设中自动搭建网站源码
  • 湖北建设工程造价协会网站哈尔滨网站搜索优化公司
  • wordpress网站换域名注册一个咨询公司需要多少钱