Mysql(17)——优化

2023-05-16

前言

请添加图片描述

一、SQL和索引优化

二、应用优化

除了优化SQL和索引,很多时候,在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对上层的应用来进行一些优化,使得上层应用访问数据库的压力能够减到最小。

2.1、连接池

应用上一般访问数据库,都是先和MySQL Server创建连接,然后发送SQL语句,Server处理完成后,再把结果通过网络返回给应用,然后关闭和MySQL Server的连接,因此短时间大量的数据库访问,消耗的TCP三次握手和四次挥手所花费的时间就很大了,稍微大一点的项目,我们都会在应用访问数据库的那一层上,添加连接池模块,相当于应用和MySQL Server事先创建一组连接,当应用需要请求MySQL Server时,不需要再进行TCP连接和释放连接了,一般连接池都会维护以下资源:
1、连接池里面保持固定数量的活跃TCP连接,供应用使用。
2、如果应用瞬间访问MySQL的量比较大,那么连接池会实时创建更多的连接给应用使用。
3、当连接池里面的TCP连接一段时间内没有被用到,连接池会释放多余的连接资源,保留它设置的最大空闲连接量就可以了。连接池可以自己实现,也可以用第三方写好的库。

2.2、增加cache缓存层

业务上增加redis、memcache,用于存储热点数据,一般用缓存把经常访问的数据缓存起来,减轻mysql的流量。

三:MySQL Server优化

对于MySQL Server端的优化,主要指的就是MySQL Server启动时加载的配置文件的配置项内容的优化(就是那个my.ini或者my.cnf),比如通过参数设置关闭自适应哈希索引,下面我们看看它的配置文件中有哪些是我们需要重点关注的优化参数。

3.1、MySQL查询缓存

MySQL的查询缓存是把select查询语句上一次的查询结果记录下来放在缓存当中,下一次再查询相同内容的时候,直接从缓存中取出来就可以了,不用再进行一遍真正的SQL查询。但是当两个select查询中间出现insert,update,delete语句的时候,查询缓存就会被清空。查询缓存适用更新不频繁的表,因为当表更新频繁的话,查询缓存也总是被清空,过多的查询缓存的数据添加和删除,就会影响MySQL的执行效率,还不如每次都从磁盘上查来得快(缓存指的就是一块内存,内存I/O比磁盘I/O快很多)。可以在MySQL上通过以下命令,来查看查询缓存的设置:

mysql> show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name                | Value |
+------------------------------+---------+
| have_query_cache             | YES   |  表示MySQL Server是否支持查询缓存,此处YES为支持!
| query_cache_limit            |1048576|
| query_cache_min_res_unit     | 4096  |
| query_cache_size             |1048576|  表示查询缓存的大小,单位为M
| query_cache_type             | OFF   |  表示目前查询缓存目前未开启
| query_cache_wlock_invalidate | OFF   |
+------------------------------+---------+
6 rows in set (0.00 sec)

通过show status命令,可以查看MySQL查询缓存的使用状况,如下

mysql> show status like 'Qcache%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |  查询缓存中的空闲内存块的数目
| Qcache_free_memory      | 1031832 |  查询缓存的空闲内存总数
| Qcache_hits             | 0       |
| Qcache_inserts          | 0       |  被加入到缓存中的查询数目
| Qcache_lowmem_prunes    | 0       |  因为缺少内存而被从缓存中删除的查询数目
| Qcache_not_cached       | 170     |
| Qcache_queries_in_cache | 0       |  在缓存中已注册的查询数目
| Qcache_total_blocks     | 1       |  查询缓存中的块的总数目
+-------------------------+---------+
8 rows in set (0.00 sec)

可以通过set命令设置上面的缓存参数开启MySQL查询缓存功能,也可以找到MySQL的配置文件(windows是my.ini,linux是my.cnf),修改query_cache_type参数为1就可以了,然后重启MySQL Server就可以使用了,如下:

query_cache_type=1
query_cache_size=10

修改完成,重启MySQL Server,查询缓存生效。

3.2、索引和数据缓存

主要指的就是innodb_buffer_pool_size配置项,从名字上就能看到,该配置项是针对InnoDB存储引擎起作用的,这个参数定义了InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。innodb_buffer_pool_size是同时为数据块和索引块做缓存,这个值设得越高,访问表中数据需要的磁盘 I/O 就越少。

innodb_buffer_pool_size=512M 

3.3、MySQL线程缓存

主要指配置文件中thread_cache_size配置项。给大家讲过MySQL Server网络模块采用经典的I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)。

thread_cache_size=10

配置完thread_cache_size,重启MySQL Server服务生效。

3.4、并发连接数量和超时时间

MySQL Server作为一个服务器,可以设置客户端的最大连接量和连接超时时间,如果数据库连接统计数量比较大,这两个参数的值需要设置大一些。

mysql> show variables like '%connect%';
+-----------------------------------------------+-----------------+
| Variable_name                                 | Value           |
+-----------------------------------------------+-----------------+
| character_set_connection                      | utf8            |
| collation_connection                          | utf8_general_ci |
| connect_timeout                               | 10              |
| disconnect_on_expired_password                | ON              |
| init_connect                                  |                 |
| max_connect_errors                            | 100             |
| max_connections                               | 151             |
| max_user_connections                          | 0               |
| performance_schema_session_connect_attrs_size | 512             |
+-----------------------------------------------+-----------------+
9 rows in set (0.01 sec)

在配置文件(my.cnf或my.ini)最下面,添加配置:max_connections=2000,然后重启MySQL Server,设置生效。

mysql> show global variables like '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| have_statement_timeout      | YES      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 60       |
| wait_timeout                | 28800    |
+-----------------------------+----------+
13 rows in set (0.00 sec)

MySQL Server对于超时未通信的连接,进行主动关闭操作。设置超时时间,超过设置时间没有请求就主动断开,单位是秒,在配置文件中添加配置:wait_timeout = 600。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql(17)——优化 的相关文章

随机推荐

  • 【linux网络编程学习笔记】第二节:创建TCP通信(双向)(socket、bind、listen、accept、connect、recv、send、shutdown、server\client)

    Work won 39 t kill but worry will 劳动无害 xff0c 忧愁伤身 上一篇章中创建了TCP的客户端的服务器 xff0c 但是只能单向发送 xff0c 本章节主要讲解如何进行双向互发消息 xff0c 实现的过程
  • 航模电池及稳压降压模块—毕设简记

    航模电池及稳压降压模块简介 简述 准备给设计的控制系统选一块航模电池 xff0c 需要关注什么参数 xff1f 控制系统的传感器需要5V供电 直流减速电机需要12V供电 单片机需要7 12V供电 xff0c 这么多供电该怎么处理 xff1f
  • Laplance算子(二阶导数)

    理论 xff1a 在二阶导数的时候 xff0c 最大变化处的值为0 即边缘是零 xff0c 通过二阶导数计算 xff0c 依据此理论我们可以计算图像的二阶导数 xff0c 提取边缘 Laplance算子 二阶导数我不会 xff0c 别担心
  • yolo3_pytorch 训练voc数据集和训练自己的数据集并进行预测(github代码调试)

    训练voc数据集的步骤 xff1a xff1a 首先下载voc数据集 xff0c 将数据集放在从github中下载的项目中VOCdevkit目录中 xff08 直接将数据集拉入到项目中 xff0c 替代目标文件即可 xff09 源码下载 x
  • ros的通信机构

    ros的通信是在os层之上 xff0c 基于TCP IP协议实现 os层 xff08 操作系统层 xff09 对于开发者来讲 xff0c 是不需要关系的 中间层 xff1a TCPROS UDPROS 这是基于TCP IP协议进行重新封装的
  • 视频追踪(meanshift和camshift算法)

    import numpy as np import cv2 as cv opencv实现meanshift的api cv meanShift probImage window criteria 参数一 xff1a roi区域 xff0c 目
  • 国产的Arduino Mega 2560 R3改进版串口1丝印标注错误

    Mega 2560有四个串口 xff1a 分别是串口0 xff0c 串口1 xff0c 串口2 xff0c 串口3 而串口1的丝印标注反了 在板子中烧录如下代码 xff0c 则串口1的TX应该不断的有输出 xff0c RX没有 void s
  • Visual Studio实现光流法(opencv and Eigen)

    环境问题 xff1a 首先是在vs中安装opencv和eigen两个库 安装eigen库所推荐的链接 xff1a VS2019正确的安装Eigen库 xff0c 解决所有报错 xff08 全网最详细 xff01 xff01 xff09 Ma
  • Deformable DETR环境配置和应用

    准备工作 xff1a Deformable DETR代码路径如下 xff1a GitHub fundamentalvision Deformable DETR Deformable DETR Deformable Transformers
  • A review of visual SLAM methods for autonomous driving vehicles

    自主驾驶车辆的视觉SLAM方法回顾 原论文在文章末尾 摘要 xff1a 自主驾驶车辆在不同的驾驶环境中都需要精确的定位和测绘解决方案 在这种情况下 xff0c 同步定位和测绘 xff08 SLAM xff09 技术是一个很好的研究解决方案
  • slam原理介绍和经典算法

    1 传统slam局限性 slam算法假设的环境中的物体都是处于静态或者低运动状态的 xff0c 然而 xff0c 现实世界是复杂多变的 xff0c 因此这种假设对于应用 环境有着严格的限制 xff0c 同时影响视觉slam系统在实际场景中的
  • Git教程(李立超git和GitHub使用)

    Git教程 配置 配置name和email git config global user name 34 xxxx 34 git config global user email 34 xxx 64 xxx xxx 34 git statu
  • 需求:节目上传至MINIO后,使用mqtt进行上报

    需求 xff1a 节目上传至MINIO后 xff0c 使用mqtt进行上报 环境准备 文件管理平台 xff1a 首先需要使用minio搭建属于自己的对象存储 xff08 此步骤跳过 xff09 通信方式 xff1a MQTT方式 xff0c
  • Vue.js自定义事件的使用(实现父子之间的通信)

    vue v model修饰符 xff1a lazy number trim attrs数据的透传 xff0c 在组件 xff08 这个是写在App vue中 xff09 数据就透传到student组件中 xff0c 在template中可以
  • 简单算法——二分搜索的递归版本和非递归版本

    二分搜索 这是大家比较熟悉的算法了 xff0c 我们今天来复习一下 xff1a 前提 xff1a 二分查找要求所查找的顺序表必须是有序的 算法思路 定义left为顺序表最左端元素位置 xff0c right为顺序表右端元素位置 定义mid
  • Mysql(14)——事务

    概念 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元 只有当事务中的所有操作都正常执行完了 xff0c 整个事务才会被提交给数据库 xff1b 如果有部分事务处理失败 xff0c 那么事务就要回退到最初的状态 x
  • Mysql(15)——锁机制 + MVCC(全)

    前言 事务的隔离级别在之前我们已经学习过 xff0c 那么事务隔离级别的实现原理是什么呢 xff1f 锁 43 MVCC 下面我们就来分开讲解 xff1a 表级锁 amp 行级锁 注意 xff1a 表锁和行锁说的是锁的粒度 xff0c 不要
  • DIY无人机组装与飞控参数调试记录(DJI NAZA-LITE)

    早就想玩一玩无人机 xff0c 奈何各种原因一直没有机会 xff0c 工作之后资金富足 xff0c 加上本身工作和这个相关性比较大 xff0c 于是就自己DIY了一台无人机 一 材料准备 xff1a F450机架 GPS支架 好盈乐天 20
  • Mysql(16)——日志

    前言 我们之前了解过redo log和undo log xff0c 他们是作用在InnoDb存储引擎层的 xff0c 今天我们来讲讲服务层的其他日志类型 一 错误日志 错误日志是 MySQL 中最重要的日志之一 xff0c 它记录了当 my
  • Mysql(17)——优化

    前言 一 SQL和索引优化 二 应用优化 除了优化SQL和索引 xff0c 很多时候 xff0c 在实际生产环境中 xff0c 由于数据库服务器本身的性能局限 xff0c 就必须要对上层的应用来进行一些优化 xff0c 使得上层应用访问数据