MySQL部分配置解析【持续更新】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一些mysql的配置参数解析,性能优化。

Mysql数据库配置详解(基于5.7版本)

首先说一下mysql的session和global

global:全局,不包含当前连接,之后新获取的连接都会生效。
session:当前会话,也就是当前连接。

  • 在MySQL中要修改全局(global)变量,有两种方法:
  1. 修改my.ini配置文件,如果要设置全局变量最简单的方式是在my.ini文件中直接写入变量配置,

此方法需要重启数据库服务,重启后全局变量永久生效。

  1. 使用关键字global设置全局变量,如:

SET GLOBAL autocommit=1; // 开启自动提交
需要注意的是,使用此方法对global全局变量的设置仅对于新开启的会话才有效,对已经开启的会话不生效。并且数据库重启后该设置失效。

  • 在MySQL中要修改会话(session)变量,可以使用session关键字,如:

SET SESSION autocommit=1;
修改session变量配置,仅仅是对本session的变量配置有效,对于其他session无效。
mysql 直接set不加global或者session时,mysql默认的时session级别,如:
SET autocommit=1;此时和的SET SESSION autocommit=1;效果一致。

  • 需要注意的是虽然设置了global变量、session变量,但是在mysql服务重启之后,数据库的配置又会重新初始化,一切按照my.ini的配置进行初始化。global和session的配置都会失效了。

mysql服务端的一些配置项(性能相关)

基础配置

  • max_connections

    MySQL的最大连接数,MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。
    如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,
    因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
    数值过小会经常出现ERROR 1040: Too many connections错误,这里可以主要查看以下两个数值,以分析设置合适的数值。

    1. 通过show variables like 'max_connections'; 查看 max_connections 当前设置的值。
    2. 通过show status like 'max%connections'; 查看 Max_used_connections 数值。

    这两个数值大致关系:max_used_connections / max_connections * 100% (理想值≈ 85%)
    如果 max_used_connectionsmax_connections 相同,那么就是 max_connections 设置过低或者超过服务器负载上限了,低于10%则设置过大
    MySQL的 max_connections 参数用来设置最大连接(用户)数。每个连接MySQL的用户均算作一个连接,max_connections默认值为100

    由于MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了 max_connections 。因此MySQL的实际最大可连接数为max_connections+1;

    max_connections 参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;
    增加 max_connections 参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
    该参数设置过小的最明显特征是出现”Too many connections”错误;一般来说,该参数在服务器资源够用的情况下应该尽量设置大,以满足多个客户端同时连接的需求。否则容易出现类似”Too many connections”的错误。

  • max_allowed_packet

    有时候包含大量数据的插入和更新会被 max_allowed_packet 参数限制掉,导致失败。
    比如说:将本地数据库迁移到远程数据库时运行sql错误。可能会报 max_allowed_packet 相关的错误。

    再比如:插入数据时某个字段数据过于庞大(比如"text"、"blob"等字段类型),会报
    Packet for query is too large (20682943>1048576). You can change this value on the server by setting the max_allowed_packet’ variable.

    这个参数是指mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小

    5.7版本的默认值为4M。据官网描述, 数据包的值范围为1k~1G, 只能是1024的倍数,不能整除1024的,会向下取整。 若设置成1025,最终结果为1024。

  • interactive_timeoutwait_timeout

    这两个参数放在一起说,是因为它们两个通常是成对设置的。比如说,有时候你在配置文件中写入 wait_timeout = 60,然后重启MySQL服务器发现并未生效。
    此时要同时设置 interactive_timeoutwait_timeout 才会生效。

    下面来解释一下这两个参数的功能。

    • interactive_timeout:

    参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在 mysql_real_connect()中使用 CLIENT_INTERACTIVE 选项的客户端。
    参数默认值:28800秒(8小时)

    • wait_timeout:

    参数含义:服务器关闭非交互连接之前等待活动的秒数。
    在线程启动时,根据全局 wait_timeout 值或全局 interactive_timeout 值初始化会话 wait_timeout值,取决于客户端类型(由 mysql_real_connect()的连接选项 CLIENT_INTERACTIVE 定义)。。
    参数默认值:28800秒(8小时)

    上边的参数含义可能不是很好理解,再简单的说一下。
    首先要说明一下交互式和非交互式。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
    举个好接受的例子,就是通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
    interactive_time — 其取值范围随 wait_timeout 变动,默认值28800。比如我们在终端上进入mysql管理,使用的就是交互式连接。这时候,如果长时间未操作,超过了 interactive_time 设置的时间就会自动断开。

    wait_timeout — 当一个客户端连接到MySQL数据库后,如果客户端不自己断开,也不做任何操作,MySQL数据库会将这个连接保留 wait_timeout 这么长时间(单位是s,默认是28800s,也就是8小时),
    超过这个时间之后,MySQL数据库为了节省资源,就会在数据库端断开这个连接;当然,在此过程中,如果客户端在这个连接上有任意的操作,MySQL数据库都会重新开始计算这个时间。

    MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,
    他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。
    在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。

  • tmp_table_sizemax_heap_table_size

    这两个值通常也是成对出现,是应为对于某些query,MySQL会创建临时表来进行处理,临时表有两种:基于MEMORY存储引擎的临时内存表以及基于MyISAM存储引擎的临时磁盘表。当临时内存表的大小达到一定限制的时候,
    MySQL就会将临时内存表写入到磁盘,变为临时磁盘表。这个限制由 tmp_table_sizemax_heap_table_size 这两个变量中的最小值确定。

    • tmp_table_size

    内存中内部临时表的最大大小。此变量不适用于用户创建的表,默认值为16M。
    其实在优化sql的时候就因该尽量避免临时表的产生。如果你需要执行很多高级查询,同时你的服务器上有足够的内存,那就适当的调高 tmp_table_size值。因为,
    如果生成的临时表数据量大于 tmp_table_size 则会将临时表存储到磁盘而不是内存,这时会加大系统I/O压力,同时严重影响读写速度。

    • max_heap_table_size

    此变量设置允许用户创建的内存表的最大值。因为临时表也是属于内存表所以也会受此参数的限制。所以如果要增加 tmp_table_size 的大小也需要考虑 max_heap_table_size 的大小。

    • 可以通过 Created_tmp_disk_tables Created_tmp_tables 状态来分析是否需要增加 tmp_table_size
  • table_open_cache

    所有线程所打开的表个数。增加此值会增加mysqld进程所需的文件描述符(FD)的数量(和 open_files_limit 参数有关)。

    MySQL是多线程的,可能在同一时刻有多个客户端访问同一张表。为了能最小化多个客户端在相同表上的不同状态问题,并发会话中访问的每张表都会单独打开。虽然这可能消耗过多的内存,但是通常会提高系统的性能。

    调大 table_open_cache 参数值,可以减少业务表频繁打开和关闭。至于调整到多少合适,可以查看 MySQL 状态参数 Open_tablesOpened_tables,当 Open_tables 接近 table_open_cache
    并且 Opened_tables 不会快速增加时,那么此时的 table_open_cache 值就是一个比较合适的值。

  • table_open_cache_instances

    打开的表缓存实例数。此参数一般是搭配 table_open_cache 使用。为了通过减少会话之间的争用来提高可伸缩性,可以将打开的表缓存分区为几个大小为 table_open_cache / table_open_cache_instances 的较小缓存实例。
    默认值为16。就可以简单的理解为,若此值为1时,那么所有会话访问同一个缓存区,可能会有资源争用的情况。为16时,将用来缓存打开表的缓存区切分成16个实例。
    会话只需锁定一个实例即可访问 DML 语句。这会在实例之间分段缓存访问,从而允许在有许多会话访问表时使用缓存的操作具有更高的性能。(DDL 语句仍然需要对整个缓存进行锁定,但此类语句的频率远低于 DML 语句。)

    若服务器为16个或更多内核的系统,建议值为8或16

    注意:如果表上有许多大型触发器导致内存负载过高table_open_cache_instances的默认设置可能会导致内存使用过度。在这种情况下,为了限制内存使用,可能要考虑将table_open_cache_instances设置为1

  • table_definition_cache

    可以存储在表定义缓存中的表定义数。当MySQL中存在大量的表,此缓存会提高对表定义信息的访问效率。

    如果数据字典缓存中的表实例数超过 table_definition_cache 限制,LRU 机制将开始标记要逐出的表实例,并最终将其从 InnoDB 数据字典缓存中删除。由于具有外键关系的表实例未放在 LRU 列表中,
    因此具有缓存元数据的打开表的数量可能会高于 table_definition_cache限制。

    此参数和 innodb_open_files 有关系,因为,一次可以打开的每个表空间的文件数受 table_definition_cacheinnodb_open_files 设置的限制。同时设置时,取更高者。

    Tip:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的置换算法,选择最近最久未使用的予以淘汰。

innodb相关配置

持续更新中。。。。。。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
76 9
|
11天前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
|
1月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
131 3
|
1月前
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
78 2
|
1月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
1月前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
166 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
163 3
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多