MySQL优化-v2.0

Linux系统优化

swap

echo “0” >/proc/sys/vm/swappiness
将内容临时改为0(不适用swap)
/etc/sysctl.conf上添加vm.swappiness=0(永久关闭)

这个参数决定了Linux系统倾向于使用swap还是释放文件系统cache,内存紧张情况下,数值越低越倾向释放文件系统cache,但是这个参数只能减少swap使用的概率,并不能避免Linux使用swap

修改MySQL配置参数innodb_flush_method,开启O_DIRECT模式,innoDB的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log 依旧会使用文件系统cache,值得注意的是redo log 是覆写模式的,即使用了文件系统的cache,也不会使用太多

IO调度策略

CentOS7默认是deadline

#临时修改为deadline
echo “deadline” >> /sys/block/sda/queue/scheduler
(sda是磁盘名)

MySQL参数优化

max_conniections

wite_timeout和interactive_timeout

mysql> select @@wait_timeout;
+----------------+
| @@wait_timeout |
+----------------+
|          28800 |
+----------------+
1 row in set (0.00 sec)

mysql> select @@interactive_timeout;
+-----------------------+
| @@interactive_timeout |
+-----------------------+
|                 28800 |
+-----------------------+
1 row in set (0.00 sec)

默认都是28800

wite_timeout:指MySQL在关闭一个非交互式的连接之前要等待的藐视
interactive_timeout:指MySQL在关闭一个交互式的连接之前要等待的秒数

例如我们在终端进行操作,使用的交互式连接(连接会占用一定的资源,即使没有任何操作),这时候如果没有操作的时间超过了interactive_timeout设置的时间就会自动断开

设置

如果设置时间过长会占用大量资源,在show processlist能看到很多sleep的连接,尽可能降低

设置方式(添加进配置文件/etc/my.conf):
wait_timeout=1200
interactive_timeout=60

key_buffer_size

mysql> select @@key_buffer_size;
+-------------------+
| @@key_buffer_size |
+-------------------+
|           8388608 |
+-------------------+
1 row in set (0.00 sec)
mysql> show variables like "key_buffer_size%";
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set (0.01 sec)
key_buffer_size: 指定索引缓冲区大小,它决定索引处理的速度,尤其是索引读的速度
	和MyISAM表的索引有关
	临时表的创建有关(多表查询,子查询,union),进行这些时需要创建临时表,用完后就被丢弃
	临时表的两种创建方式:
		内存中:key_buffer_size
		磁盘中:ibdata1(5.6中)ibtmp(5.7中)

查看磁盘当前临时表的使用情况

mysql> show status like "created_tmp%";
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
#磁盘中创建的临时表数
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 1     |
#内存中的临时表数
+-------------------------+-------+
3 rows in set (0.00 sec)

计算临时表设置数量:
created_tmp_tables/(create_tmp_disk_tables+created_tmp_tables)
内存表数/(内存表数+磁盘表数)
控制在%5~%10之间
在使用MySQLdump备份时会大量使用临时表空间

query_cache_size

mysql> select @@query_cache_size;
+--------------------+
| @@query_cache_size |
+--------------------+
|            1048576 |
+--------------------+
1 row in set, 1 warning (0.00 sec)

查询缓存简称QC,使用查询缓冲,MySQL将查询结果放在查询缓存中,对于今后同样的select语句(区分大小写),将直接从缓冲区中调取

查询结果之后,会将SQL语句进行hash运算,得出hash值,成为SQL_ID
会将存储引擎返回结果+SQL_ID存储到缓存中
一条SQL执行时,进行hash运算,得出SQLID,去找query cache
如果cache中有,则直接返回数据,没有继续执行原有的SQL流程
#如果两条语句,哪怕相差一个字符(多个空格或者大小写不同)都会得到不同的hash,并且使用不同的cache
mysql> show status like "%Qcache%"
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |
#缓存中相邻内存块的个数
| Qcache_free_memory      | 1031832 |
#query cache中剩余的内存大小,通过这个参数观察时候足够
| Qcache_hits             | 0       |
#命中缓存的次数
| Qcache_inserts          | 0       |
#多少次为命中然后插入缓存
| Qcache_lowmem_prunes    | 0       |
#多少条query不足被清出cache
| Qcache_not_cached       | 182     |
不适合进行缓存的数量
| Qcache_queries_in_cache | 0       |
当前缓存中query的数量
| Qcache_total_blocks     | 1       |
当前query中的block的数量
+-------------------------+---------+
8 rows in set (0.00 sec)

计算命中率

Query_hits / (Qcache_inserts + Qcache_not_cached + Query_hits)
mysql> show variables like "%query_cache%";
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |
| query_cache_limit            | 1048576 |
#超过此大小的查询将不缓存
| query_cache_min_res_unit     | 4096    |
#缓存块的大小(默认是4K)
| query_cache_size             | 1048576 |
#查询缓存的总大小
| query_cache_type             | OFF     |
#查询缓存,默认没有开启
	#缓存类型,0为禁用,1会缓存所有结果,2需要通过SQL_CACHE指定要缓存
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set (0.00 sec)

开启:

修改配置文件
query_cache_size=128M
query_cache_type=1

max_connect_errors

mysql> select @@max_connect_errors;
+----------------------+
| @@max_connect_errors |
+----------------------+
|                  100 |
+----------------------+
1 row in set (0.00 sec)

MySQL的错误连接数,连接数太多会影响正常连接数,每次重启都会清零,每次错误都会加一,也可以手动使用flush host清除

sort_buffer_size

排序缓冲区大小:每个需要进行排序的线程分配该大小的一个缓冲区,order by ,oroup by,distinct,union都会涉及

此参数不是越大越好,由于是connection级的参数,过大的设置_高并发会好近系统内存资源

配置方法:

修改配置文件
	sort_buffer_size=1M

max_allowed_packet

mysql> select @@max_allowed_packet
+----------------------+
| @@max_allowed_packet |
+----------------------+
|              4194304 |
+----------------------+
1 row in set (0.00 sec)

MySQL根据配置文件会限制server接受数据包的大小
配置依据:

有时候大的插入和更新会受max_allowed_packet参数限制,导致写入或者更新失败,更大值是1G,必须是1024的倍数

配置方法

修改配置文件
max_allowed_packet=32M

join_buffer_size

用于表间关联缓存的大小,和sort_buffer_size一样,该参数分配的内存也是每个线程链接独享
优化方法:在ON条件列加索引,至少应该有MUL索引
这个参数越优化应当越小

thread_cache_size

服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程将被放到缓存中以响应下一个响应而不是销毁(前提是缓存数未达到上限),如果线程被重新请求,那么请求将直接从缓存中读取,如果是新的清秀,那么这个线程将会重新创建

配置依据:
通过比较connections和threads_created状态,可以看到这个变量的作用
配置规则:1G内存为8,2G内存为16,3G内存32…

你可能感兴趣的:(MySQL)