网络知识 娱乐 MySQL数据库配置优化

MySQL数据库配置优化

MySQL参数优化对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系, 优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果。 下面列出了对性能优化影响较大 的主要变量,主要分为连接请求的变量和缓冲区变量

连接请求的变量:
max_connections
MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多, MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
查看最大连接数
语法:show variables like ‘max_connections’
在这里插入图片描述

此图中能看出最大连接数为151
max_used_connections
查看响应的连接数
语法:show status like ‘max_used_connections’
在这里插入图片描述

此图中能看出响应连接的主机有两台
max_used_connections(响应的连接数) / max_connections (最大连接数)* 100% (理想值≈ 85%) 如果max_used_connections(响应的连接数)跟 max_connections(最大连接数)相同那么就是max_connections(最大连接数)设置过低或者超过服务器负载上限了,低于10%则设置过大。
如要修改最大连接数需修改主配文件/etc/my.cnf
在这里插入图片描述

配置完主配·后·需重启mysql数据库systemctl restart mysqld当重启完后我们再次查询会发现最大连接数已改为200
在这里插入图片描述

查看当前有多少用户连接
语法:select * from information_schema.processlist
information_schema数据字典
processlist进程列表 正在运行服务器线程的列表 当前有多少用户连接进来
查看mysql连接用户
在这里插入图片描述

暂存
back_log
back_log MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,它就会起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它。
查看有多少暂存
语法:show variables like ‘back_log’;
在这里插入图片描述

如果要修改暂存需去主配中修改
在这里插入图片描述

更改完后重启MySQL服务会发现暂存已经更改
在这里插入图片描述

重启mysql服务
wait_timeout(交互式)和interactive_timeout (非交互式)
wait_timeout – 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数 interactive_time – 指的是mysql在关闭一个交互的连接之前所要等待的秒数,比如我们在终端上 进入mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时 间就会自动断开。
默认数值是28800,可调优为7200。
对性能的影响: wait_timeout: (1)如果设置 大小,那么连接关闭的很快,从而使一些持久的连接不起作用 (2)如果设置太大,容易造成连接打开 时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误 (3)一般希望wait_timeout尽可能地低 interactive_timeout的设置将要对你的web application没有多大 的影响 查看wait_timeout和interactive_timeout
查看交互式时间
语法:show variables like ‘wait_timeout’;
在这里插入图片描述

查看非交互式时间
语法:show variables like ‘interactive_timeout
在这里插入图片描述

如果要设置交互式与非交互式需进入主配修改
在这里插入图片描述

更改完后重启mysql服务发现交互式与非交互式已经更改
在这里插入图片描述

缓存区变量
全局缓存
key_buffer(缓冲)_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。 通过检查状态值Key_read_requests(索引的大小)和Key_reads(索引的速度),可以知道key_buffer_size设置是否合理。
一共有6个索引读取请求,有3个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率: key_cache_miss_rate = Key_reads / Key_read_requests * 100% =50% key_buffer_size只对MyISAM表起作用。 即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值 created_tmp_disk_tables得知详情。
查看索引缓存区
语法:show variables like ‘key_buffer_size’
在这里插入图片描述

如过需要自己设置可在主配中设置
在这里插入图片描述

设置完后重启mysql服务器查看设置
在这里插入图片描述

注:如果key_buffer_size(索引缓冲区)满了可以在show status like ‘create_tmp_tables’中查看

Query(查询)_cache(缓存)_size(大小)
query_cache_size(查询缓存简称QC) 使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样 的SELECT语句(区分大小写),将直接从缓冲区中读取结果。 一个SQL查询如果以select开头,那么 MySQL服务器将尝试对其使用查询缓存。
注:两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样;多一个空格等),那么这两个SQL 将使用不同的一个CACHE。
Qcache_free_blocks:缓存中相邻内存块的个数。如果该值显示较大,则说明Query Cache 中的内存碎片较多 了,FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。 注:当一个表被更新之后,和 它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。可以用 FLUSH QUERY CACHE语句来清空free blocks Qcache_free_memory:Query Cache 中目前剩余的内存大小。通 过这个参数我们可以较为准确的观察出当前系统中的Query Cache 内存大小是否足够,是需要增加还是过多 了。 Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大, 缓存效果越理想。 Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不 得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到 的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。 Qcache_lowmem_prunes:多 少条Query 因为内存不足而被清除出Query Cache。通过“Qcache_lowmem_prunes”和“Qcache_free_memory”相 互结合,能够更清楚的了解到我们系统中Query Cache 的内存大小是否真的足够,是否非常频繁的出现因为内 存不足而有Query 被换出。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重, 或者内存很少。(上面的free_blocks和free_memory可以告诉您属于哪种情况) Qcache_not_cached:不适合 进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。 Qcache_queries_in_cache:当前Query Cache 中cache 的Query 数量; Qcache_total_blocks:当前Query Cache 中的block 数量;。
查询缓冲
语法:show variables like ‘query_cache_size’
在这里插入图片描述

query_cache_limit:超过此大小的查 询将不缓存 query_cache_min_res_unit:缓存块的最小大小 ,query_cache_min_res_unit的配置是一柄”双刃 剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪 费。 query_cache_size:查询缓存大小 (注:QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024 的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。) query_cache_type:缓存类型,决 定缓存什么样的查询,注意这个值不能随便设置,必须设置为数字
query_cache_type三个参数的含义:
query_cache_type=0(OFF)关闭
query_cache_type=1(ON)缓存所有结果,除非select语句使用SQL_NO_CACHE禁用查询缓存 query_cache_type=2(DEMAND),只缓存select语句中通过SQL_CACHE指定需要缓存的查询
如果命中没有开启需要在主配中打开
在这里插入图片描述

查看命中与非命中
在这里插入图片描述

如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。 如果设置为1,将会缓存所有的结果,除 非你的select语句使用SQL_NO_CACHE禁用了查询缓存。 如果设置为2,则只缓存在select语句中通过 SQL_CACHE指定需要缓存的查询。 query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操 作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100% 如果查询缓存碎片率超过20%,可以用 FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的 话。 查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100% 查询缓存利用 率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且 Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。 查询缓存命中率 = Qcache_hits/(Qcache_hits +Qcache_inserts) * 100%
Query Cache 的限制 a) 所有子查询中的外部查询SQL 不能被Cache; b) 在Procedure,Function 以及Trigger 中 的Query 不能被Cache; c) 包含其他很多每次执行可能得到不一样结果的函数的Query不能被Cache。 鉴于上面 的这些限制,在使用Query Cache 的过程中,建议通过精确设置的方式来使用,仅仅让合适的表的数据可以进 入Query Cache,仅仅让某些Query的查询结果被Cache。

max_connect_errors
max(最大)_connect(连接,打开一个终端)_errors(错误)
是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况,当超过指定次数,MYSQL服务器将禁止host的连接请求,直到mysql服务器重启或 通过flush hosts命令清空此host的相关信息。
修改主配文件来防止暴力破解
在这里插入图片描述

如果有人恶意破解数据库密码输入错误五次后将无法在输入密码如果要自己实验需yum安装telnet

sort_buffer_size
Sort(排序)_buffer(缓存)_size(大小)每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。 Sort_Buffer_Size 是一个connection级参数,在每个connection(session)第一次需要使用这个 buffer的时候,一次性分配设置的内存。 Sort_Buffer_Size 并不是越大越好,由于是connection级的参 数,过大的设置+高并发可能会耗尽系统内存资源。
修改主配文件进行排序分配
在这里插入图片描述

配置完成后需重启mysql服务器

max_allowed_packe
max_allowed_packet(数据包大小) = 32M MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更 新会受 max_allowed_packet 参数限制,导致写入或者更新失败。最大值是1GB,必须设置1024的倍数。
修改主配文件设置数据包大小
在这里插入图片描述

join_buffer_size
join_buffer_size(连接缓冲区大小) = 2M 用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
修改主配文件设置连接缓冲区大小
在这里插入图片描述

thread_cache_size
thread_cache_size(线程缓存大小) = 300 服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开 连接时,那么客户端的线程将被放到缓存中以响应下一个客户而不是销毁(前提是缓存数未达上限),如果线 程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创 建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态 的变量,可以看到这个变量的作用。
设置规则如下:1GB 内存配置为8,2GB配置为16,3GB配置为32, 4GB或更高内存,可配置更大。服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前 提是缓存数未达上限
Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。 Threads_connected :代表当前已建立连接的 数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。 Threads_created :代表从最近一 次服务启动,已创建线程的数量,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程, 这也是比较耗资源,可以适当增加配置文件中thread_cache_size值。 Threads_running :代表当前激活的(非睡 眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态。
修改主配设置线程缓存大小
在这里插入图片描述

配置innodb的几个变量
innodb_buffer_pool_size
innodb_buffer_pool_size(innodb加快索引速度) 对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对 于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数 据库服务器,最大可以把该值设置成物理内存的80%。根据MySQL手册,对于2G内存的机器,推荐值是 1G(50%)。 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大
配置主配文件来设置索引速度
在这里插入图片描述

innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit(innodb刷新日志) 主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时 间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中 的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、 flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完 成一次flush磁盘操作。 实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录 只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操 作合并成一个事务,这样可以大幅提高速度。 根据MySQL手册,在允许丢失最近部分事务的危险的前提 下,可以把该值设为0或2。
配置主配文件来刷新innodb日志
在这里插入图片描述

innodb_thread_concurrency
innodb_thread_concurrency(innodb线程的并发量) = 0 此参数用来设置innodb线程的并发数量,默认值为0表示不限制,若 要设置则与服务器的CPU核数相同或是cpu的核数的2倍,建议用默认设置,一般为8.
配置主配来设置innodb线程并发量
在这里插入图片描述

innodb_log_buffer_size
innodb_log_buffer_size(innodb事务日志大小) 此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能, 对于较大的事务,可以增大缓存大小。
配置主配来设置innodb事务日志大小
在这里插入图片描述

innodb_log_file_size
innodb_log_file_size(innodb文件大小) = 50M 此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能.
配置主配来设置innodb文件大小
在这里插入图片描述

innodb_log_files_in_group
innodb_log_files_in_group(innodb日志分组) = 3 为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3默认为2
配置主配来设置innodb日志分组
在这里插入图片描述

read_buffer_size
read_buffer_size(读取大小) = 1M MySql 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区, MySql会为它分配一段内存缓冲区。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太 慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。和 sort_buffer_size一样,该参数对应的分 配内存也是每个连接独享。
配置主配来设置读取大小
在这里插入图片描述

read_rnd_buffer_size
read_rnd_buffer_size (随机缓存区大小)= 16M MySql 的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如, 按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁 盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该 缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。 注:顺序读是指根据索引的叶节点数据就 能顺序地读取所需要的行数据。随机读是指一般需要根据辅助索引叶节点中的主键寻找实际行数据,而 辅助索引和主键所在的数据段不同,因此访问方式是随机的。
配置主配来设置随机缓存区大小
在这里插入图片描述

bulk_insert_buffer_size
bulk_insert_buffer_size(批量插入) = 64M 批量插入数据缓存大小,可以有效提高插入效率,默认为8M
配置主配文件设置批量插入
在这里插入图片描述

binary log log-bin
binary log log-bin(二进制日志分配内存)=/usr/local/mysql/data/mysql-bin binlog_cache_size = 2M //为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存,提高记录bin-log的效率。没有什么大事务,dml也不是很 频繁的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。前者建议 是–1M,后者建议是:即 2–4M max_binlog_cache_size = 8M //表示的是binlog 能够使用的最大cache 内存大小 max_binlog_size = 512M //指定binlog日志文件的大小,如果当前的日志大小达到 max_binlog_size,还会自动创建新的二进制日志。你不能将该变量设置为大于1GB或小于4096字节。默 认值是1GB。在导入大容量的sql文件时,建议关闭sql_log_bin,否则硬盘扛不住,而且建议定期做删 除。 expire_logs_days = 7 //定义了mysql清除过期日志的时间。 二进制日志自动删除的天数。默认值为 0,表示“没有自动删除”。 mysqladmin flush-logs 也可以重新开始新的binary log
配置主配文件为二进制日志分配内存
在这里插入图片描述

.log_queries_not_using_indexes
.log_queries_not_using_indexes(不使用索引) 开启这个选项真实地记录了返回所有行的查询。
配置主配文件不使用索引
在这里插入图片描述

配置优化

slow_query_log = 1(慢查询日志)
slow_query_log_file = /usr/local/mysql/data/slow-query.log
long_query_time = 1(基于时间)
log-queries-not-using-indexes(不使用索引)
max_connections = 1024(最大连接数)
back_log = 128(暂存)
wait_timeout = 60(非交互式)
interactive_timeout = 7200(交互式)
key_buffer_size=256M(加快索引读的速度)
query_cache_size = 256M(查询索引)
query_cache_type=1(查询索引所有类型)
query_cache_limit=50M(限制查询结果)
max_connect_errors=20(错误)
sort_buffer_size = 2M(排序速度)
max_allowed_packet=32M(数据包大小)
join_buffer_size=2M(连接)
thread_cache_size=200(线程缓存大小)
innodb_buffer_pool_size = 2048M(innodb加快索引缓存)
innodb_flush_log_at_trx_commit = 1(事务提交刷日志参数)
innodb_log_buffer_size=32M(事务日志大小)
innodb_log_file_size=128M(日志大小)
innodb_log_files_in_group=3(轮询的方式默认为2)
log-bin=mysql-bin(二进制)
binlog_cache_size=2M(二进制缓存大小)
max_binlog_cache_size=8M(最大的二进制缓存大小)
max_binlog_size=512M(二进制大小)
expire_logs_days=7(二进制超时时间)
read_buffer_size=1M(读取大小)
read_rnd_buffer_size=16M(随机缓存区大小)
bulk_insert_buffer_size=64M(批量插入)
log-error = /usr/local/mysql/data/mysqld.err(错误日志)
server_id=1(二进制日志)