一、架构

想要学好SQL优化就必须从对应数据库的基本架构开始学习

  • 架构图如下

二、架构分析

1. 连接管理与安全验证

​     MySQL有连接池(Connection Pool)管理客户端的连接。客户端连接会验证用户名、密码、主机信息等。

2. 缓存(Cache&Buffer):

​     缓存中存储了SQL命令的HASH,直接比对SQL命令的HASH和缓存中key是否对应,如果对应,直接返回结果,不在执行其他操作。由于缓存的是SQL的HASH,所以根据Hash特性SQL中空格等内容必须完全一样。缓存里面包含表缓存、记录缓存、权限缓存等。查询语句执行完成后会把查询结果缓存到缓存中。查询缓存的目的是提高查询性能,缺点是做删除修改时影响性能,适合在大量查询很少修改情况时使用。

  • 2.1 在MySQL5.7中查询缓存默认不开启。可以通过
SHOW VARIABLES LIKE '%query_cache%
  • 2.2 参数中query_cache_type 设置是否开启查询缓存
    • 0(OFF):关闭Query Cache功能,任何情况下都不会使用Query Cache;
    • 1(ON):开启Query Cache功能,但是当SELECT语句中使用SQL_NO_CACHE体会后,将不使用Query Cache;
    • 2(DEMAND):开启Query Cahce功能,但是只有当SELECT语句中使用了SQL_CACHE提示后,才是用Query Cache。
    • 可以通过修改my.ini或命令设置是否开启查询缓存(此命令在Navicat中可能不可用,需要去命令行设置)
set global query_chache_type = 1;
  • 2.3 query_cache_size 设置查询缓存大小,默认为0
    • 可以通过下面命令设置、如果设置值太小会导致查询缓存不可用。
set global query_cache_size = 134217728;
    • 可以通过查看缓存被使用次数查看是否使用缓存
show status like '%Qcache%';

    • Qcache_queries_in_cache 当前缓存中数量
    • Qcache_insert 插入到缓存中总数
    • Qcache_hits 缓存命中数
    • Qcache_lowmem_prunes 由于缓存较小,从缓存中山川的查询数量
    • Qcache_not_cached 没有被缓存的次数

三、SQL命令执行流程

  

  • 1、客户端向服务器发送SQL命令。
  • 2、服务器端连接模块连接并验证。
  • 3、缓存模块解析SQL为Hash并与缓存中Hash表对应。如果有结果直接返回结果,如果没有对应继续向下执行。
  • 4、解析器解析SQL为解析数,如果出现错误,包SQL解析错误。如果正确,向下传递。
  • 5、预处理器对解析数继续处理,处理成新的解析树。
  • 6、优化器根据开销自动选择最优执行计划,生成执行计划。
  • 7、执行器执行秩相关计划,访问存储引擎接口。
  • 8、存储引擎访问物理文件并返回结果。
  • 9、如果开启缓存迷魂村管理器把结果放入查询缓存中。
  • 10、返回结果给客户端。

SQL高级优化(二)之MySQL架构的更多相关文章

  1. SQL高级优化系列

    目录 SQL高级优化系列(一)之MySQL优化 SQL高级优化系列(二)之MySQL架构 SQL高级优化系列(三)之存储引擎 SQL高级优化系列(四)之SQL优化 SQL高级优化系列(五)之执行计划 ...

  2. SQL高级优化(一)之MySQL优化

    不同方案效率对比 MySQL各字段默认长度(一字节为8位) 整型: TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字 ...

  3. SQL高级优化(六)之MySQL索引

    一.索引概述 1. 索引的优点 ​ 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能.如果不使用索引,查询时从第一行开始查询.如果使用了索引,所以就可以更加快速的找到希望的数据. 第一. ...

  4. SQL高级优化(五)之执行计划

    一.explain 执行计划:在MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的. explain:MySQL执行计划的工具,查看MySQL如 ...

  5. SQL高级优化(四)之SQL优化

    SQL优化 一.SQL优化简介 解释:对于特定的要求,使用更有的SQL策略或索引策略,以达到让结果呈现的时间更短,从而提升操作效率的过程就是SQL优化. SQL优化包含在数据库级别优化中.我们平常所说 ...

  6. SQL高级优化(三)之存储引擎

    一.MySQL数据库引擎简介 1. ISAM(indexed Sequential Access Method) ​ ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据 ...

  7. SQL语句优化 (二) (53)

    接上一部分 (4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中这个索引也不会被MySQL采用. mysql> exp ...

  8. sql语句优化(二)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 建立索引好处  : 之前做的一个项目 , 一个查询10w多条的数据 ,需要20s ,后来加 ...

  9. SQL学习笔记二之MySQL的数据库操作

    阅读目录 一 系统数据库 二 创建数据库 三 数据库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限 ...

随机推荐

  1. ciscn_2019_s_3

    拿到题目例行检查 64位程序开启了nx保护,将程序放入ida 看到没有system函数第一时间想到的就是泄露libc来做,后来才知道是我学识尚浅,需要用execve函数来做 进入main发现跳转到vu ...

  2. mysql联合索引阻碍修改列数据类型:BLOB/TEXT column 'name' used in key specification without a key length

    今天在项目中mysql表中有一个字段数据类型为varchar,长度不够需要换为text类型 当时表是已经存在的表, CREATE TABLE `table_aaa` ( `id` int NOT NU ...

  3. Shell之awk常用用法

  4. django的Cookie Session

    Cookie 初识cookie的设置和获取 示例 from django.shortcuts import render, redirect from django.shortcuts import ...

  5. vscode 快速入门

    vscode 快速入门 本篇主要讲解 vscode 使用中的一些经验: 配置 vue 开发环境 - Vetur+ESLint+Prettier 代码片段的使用 常用插件 如何完全卸载 vscode 通 ...

  6. 谷歌protobuf(protocol-buffers)各种开发语言数据类型转换说明

    官方文档:https://developers.google.cn/protocol-buffers/docs/proto proto2 proto3

  7. Mysq索引优化(什么情况创建索引,什么情况不创建索引)

    一.以下情况需要创建索引 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 3.查询中与其他表关联的字段,外键关系建立索引 4.单键/组合索引的选择问题,组合索引性价比更高 5.查询中 ...

  8. JAVA判断URL地址是否非法

    /** * 判断请求url是否非法 * @param url * @return */ public static boolean isValidRequestUri(String url) { if ...

  9. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

  10. 【LeetCode】1064. Fixed Point 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 日期 题目地址:https://leetco ...