【mysql】mysql查询机制 调优不止是索引调优

news2024/9/20 8:54:52

前言:说到mysql调优 我们第一反应都是想到索引调优 应该这是最基本的 也是至关重要的;一般工作个两年 索引调优都可以掌握的八九不离十,相关数据结构特点也都能说个一二出来,所以本文重点是讲述其它机制

整体架构

在这里插入图片描述

连接器:管理连接,客户端发起请求,连接到MySQL服务器。

缓存:检查是否有相同的查询结果缓存;没有缓存则继续执行,有缓存则直接返回。

	MySQL 8.0移除查询缓存的原因
	锁竞争问题:
	查询缓存在高并发环境下会导致大量的锁竞争。
	因为查询缓存需要在查询开始时进行检查,
	在查询结束后进行更新,这会引发锁争用,
	反而降低系统性能。
	
	效果有限:
	查询缓存仅对特定的、重复的查询有效,
	而现代应用的查询往往是动态生成的,
	命中率较低,因此实际效果有限。

分析器:解析SQL语句,分析是否有语法错误等,所有SQL语句都经过解析。

优化器:优化器决定如何执行操作,选择最佳的执行顺序和索引。

执行器:执行器根据优化计划执行查询, 调用存储引擎接口

存储引擎: 执行器通过存储引擎获取数据,数据可能已经缓存到Buffer Pool中,否则需要从磁盘加载。

	buffer pool: 
	InnoDB存储引擎使用的内存区域,
	用于缓存行数据和索引。
	它可以极大地减少磁盘I/O操作,
	因为频繁访问的数据会保存在内存中,
	而不需要每次都从磁盘读取。

慢查询分析

通过mysql的架构组成,我们可以分析出,慢查询主要原因可能出现在

  1. 连接器
    连接数过小,举个栗子 如果client和mysql之间只有一条长连接,那么第二条sql查询需要等待第一条的结果返回。

    很可能出现的一种表现形式就是,程序日志显示sql执行了数分钟,但是mysql查询语句本身并没有什么问题 这就可能刚好程序执行时 连接数占满了。

    连接数由mysql端和client端配置共同决定,由于mysql默认的连接数大多场景够用 所以大部分我们只接触到配置client端连接数,如果都到了性能瓶颈的程度,那么mysql侧的连接数配置不能忽视。

    mysql服务端连接数默认为100,最大可达16384,可以通过以下命令修改
    (在my.inf修改也是可以的):

    mysql> set global max_connection=100;
    

    my.ini / my.inf 配置示例
    在这里插入图片描述
    client端配置:

    比如python中django中的配置

       # 本项目使用的是  django-db-connection-pool 连接池,另外python还有DBUtils(可以支持各种数据库)等连接池可选用
        # show PROCESSLIST; show status like '%connect%'; 可通过这两组命令验证连接池是否生效
        'POOL_OPTIONS': {
            'POOL_SIZE': 20,  # 最小
            'MAX_OVERFLOW': 20,  # 在最小的基础上,还可以增加20个,即:最大40个。
            'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。
            'TIMEOUT': 30,  # 池中没有连接最多等待的时间。
        }
    

    java中的druid连接池

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        #driver-class-name: org.postgresql.Driver
        #driver-class-name: oracle.jdbc.OracleDriver
        #driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        #driver-class-name: dm.jdbc.driver.DmDriver
        druid:
          initial-size: 5
          max-active: 20
          min-idle: 5
          max-wait: 60000	
    

    简而言之 mysql连接数决定上限,client端连接决定下限。

  2. 优化器

    优化器选错了索引执行,我们常说的索引失效或者未命中索引 也是因为优化器没能正确选择索引导致的,可以通过explain排查,至于产生原因 大家在八股文想必也看腻了 ,但不得不提醒 这部分才是重点 工作中99%调优都在索引调优层面, 本文不再重复。

    索引文章可以在博主(csdn:孟秋与你)主页搜索:mysql索引

  3. 存储引擎
    主要是针对Buffer Pool , 索引和行数据会存放在Buffer Pool中,作为一个缓冲池 它也是有大小的,如果Buffer Pool的内存被耗尽 那自然也会影响存放。

    可以通过以下命令查看Buffer Pool的命中率:

    mysql>SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
    
    

    或看更多信息

    mysql>SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_%';
    

    Innodb_buffer_pool_read_requests : 读请求次数
    Innodb_buffer_pool_reads: 从磁盘读取的次数

    在这里插入图片描述
    命中率计算:
    Buffer Pool Hit Rate = (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests

    一般命中率低于99%时,才考虑调整大小

     tips: buffer pool 根据LRU算法进行内存淘汰,比如将一些访问频率相对低的旧数据剔除。
    

    (不考虑mysql8移除的缓存因素,注意 缓存不是指buffer pool)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】手动实现String类的封装(分文件编译)

实现了String类的大部分封装&#xff0c;采用分文件编译 //mystring.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //定义一个字符串int size; //记录字符串…

比亚迪方程豹携手华为乾崑智驾,加速中国智驾技术向前

近日&#xff0c;比亚迪方程豹与华为乾崑智驾在深圳签署合作协议&#xff0c;中国两大科技巨头强强联合&#xff0c;共同合作开发全球首个硬派专属智能驾驶方案&#xff0c;实现整车智驾深度融合&#xff0c;首发搭载在即将上市的方程豹豹8车型。 比亚迪智驾以自主研发和开放合…

MySQL之数据库基础

目录 一、数据库 1、基本概念 2、常见的数据库 3、MySQL数据库 连接MySQL服务器 数据逻辑存储 二、数据库和表的本质 三、SQL语句 四、服务器&#xff0c;数据库&#xff0c;表的关系 五、存储引擎 查看存储引擎 一、数据库 1、基本概念 一般来说&#xff0c;数据库…

【软件技巧】第33课,软件逆向安全工程师之如何快速的跑到某行代码EIP设置,每天5分钟学习逆向吧!

鼠标右键在此设置EIP EIP&#xff08;Extended Instruction Pointer&#xff09;是x86架构中一个重要的寄存器&#xff0c;它用于存储当前正在执行的指令的地址。EIP是程序计数器&#xff08;Program Counter&#xff09;的扩展版本&#xff0c;因为它是32位寄存器&#xff0c…

Centos安装node_exporter

使用以下命令下载最新版本的node_exporter, 地址: https://github.com/prometheus/node_exporter/releasesorter/releases&#xff1a; wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz或本地下载上传到服…

python 字典怎么提取value

打开编辑器&#xff0c;写上注释内容。 新建一个函数getvalue。 新建一个字典。 zidian{"country1":"america","country2":"australia","country3":"germany"} 利用values这个方法来获取字典中的所有Vlue值&…

浅析synchronized锁升级的原理与实现 1

目录 背景 锁的用法 底层实现 原理分析 锁的状态 锁升级 锁升级过程 锁升级简要步骤 锁升级细化流程 背景 在多线程编程中&#xff0c;线程同步是一个关键的概念&#xff0c;它确保了多个线程对共享资源的安全访问。Java中的synchronized关键字是一种常用的线程同步机制…

数据安全与个人信息保护的辨析

文章目录 前言一、合规1、合规的目标导向原则2、监管平衡的原则二、基础设施1、公共基础设施2、企业基础设施三、数据流通1、数据生产要素是数字化时代生产要素的变革理论2、数据产品的保护源自于数据产品的价值四、产品与服务1、数据安全与网络安全2、数据安全的分类分级与数据…

Qt-信号与槽

1. 认识信号和槽 Qt中&#xff0c;谈到信号&#xff0c;涉及到三个要素. 信号源&#xff1a;由哪个控件发出的信号信号的类型&#xff1a;用户进行不同的操作&#xff0c;就可能出发不同的信号 点击按钮&#xff0c;触发点击信号 在输入框中移动光标&#xff0c;触发移动光标的…

github私有仓库通过action部署hexo到公开仓库

github私有仓库通过action部署hexo到公开仓库 有一段时间一直将博客md文件直接放到公开仓库然后通过工作流action创建一个gh-page分支&#xff0c;来实现部署 但是这样做有一个问题&#xff0c;如果你的源文件&#xff0c;或者配置文件中有涉及变量&#xff0c;或者密钥key&a…

STM32G474之TIM1输出PWM互补信号(无死区时间和BKIN输入)

STM32G474之TIM1输出PWM互补信号&#xff0c;无死区时间&#xff0c;无BKIN输入。定时器1是16向上计数器&#xff0c;16向下计数器&#xff0c;16向上/向下计数器&#xff0c;输入时钟分频值&#xff1a;“1至65536”中的任意整数&#xff1b;捕获输入通道4个&#xff0c;比较输…

【C++ Primer Plus习题】9.4

问题: 解答: main.cpp #include <iostream> #include "sales.h" using namespace std; using namespace SALES;int main() {Sales s1, s2;double de[QUARTERS] { 12.1,32.1,42.1,51.1 };setSales(s1, de, QUARTERS);showSales(s1);cout << endl;setSal…

AI图片扩展工具 | 一名非技术人员依靠AI就能写出来

前言 我本职是一个技术支持&#xff0c;原本和开发搭不到边。但这两年 AI 发展迅猛&#xff0c;让我这样的半吊子也能借助 AI 的力量写网站。 因为这两年压力大&#xff0c;所以琢磨着出海看看能不能挣到钱&#xff0c;所以在学习做网站。 这个站是我的第 5 个作品了。前面 …

盘点大模型中转 API 平台,并比较费用

1. 大模型中转 API 平台集合 1.1 DevAGI DevAGI开放平台 Open AI 价格 1.2 Deepbricks 官网价格 1.3 AiHubMix AiHubMix 官网 使用教程 价格&#xff1a; 1.4 WildCard 开卡订阅 WildCard官网 价格 有3.5% 的充值手续费&#xff0c;API 价格与 Open AI 一样 2. 价…

vue3 element-plus form 表单 循环校验

需求&#xff1a; 表单是循环出来的&#xff0c;3个一组&#xff0c;每组对于前端来说是一样的&#xff0c; 需要校验输入框是否必填是否为小数或者整数 效果&#xff1a; 未输入--显示&#xff1a;请输入 输入不是小数或整数--显示&#xff1a;请输入整数或小数 输入正确…

南京大学软件学院硕士毕业流程

背景介绍 南京大学作为国内顶尖的985高校&#xff0c;拥有丰富的校内资源和雄厚的师资力量。然而&#xff0c;在管理与协调方面仍存在一定的不足。尤其是在硕士生培养过程中&#xff0c;临近毕业阶段的流程中常出现信息不透明和混乱的现象&#xff0c;导致学生在了解所需材料和…

codeforces Round 970 (Div. 3)(A-F)

文章目录 [Codeforces Round 970 (Div. 3)](https://codeforces.com/contest/2008)A-[Sakurakos Exam](https://codeforces.com/contest/2008/problem/A)B-[Square or Not](https://codeforces.com/contest/2008/problem/B)C-[Longest Good Array](https://codeforces.com/cont…

Halcon!!!最新!! 从零认识标定板——制作描述文件和自己的标定板

一.标定板简介 ‌标定板是一种带有固定间距图案阵列的几何模型&#xff0c;主要用于机器视觉、图像测量、摄影测量、三维重建等领域。‌它的主要功能包括校正镜头畸变、确定物理尺寸和像素间的转换关系&#xff0c;以及确定空间物体表面某点的三维几何位置与其在图像中对应点之…

C练手题--Progressive Spiral Number Position 【7 kyu】

一.原题 链接&#xff1a;Training on Progressive Spiral Number Position | Codewars Assume that you started to store items in progressively expanding square location, like this for the first 9 numbers: 二、解题 1、分析 &#xff08;1&#xff09;数字必须存…

自闭症自言自语会好吗

在自闭症儿童的成长过程中&#xff0c;自言自语作为一种常见的行为表现&#xff0c;往往让家长们既担忧又困惑。这种非社交性的语言行为&#xff0c;虽然在一定程度上是自闭症孩子自我交流的方式&#xff0c;但过度或不适宜的自言自语却可能影响其社交技能和日常功能的发展。那…