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,也不会使用太多
CentOS7默认是deadline
#临时修改为deadline
echo “deadline” >> /sys/block/sda/queue/scheduler
(sda是磁盘名)
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
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备份时会大量使用临时表空间
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
mysql> select @@max_connect_errors;
+----------------------+
| @@max_connect_errors |
+----------------------+
| 100 |
+----------------------+
1 row in set (0.00 sec)
MySQL的错误连接数,连接数太多会影响正常连接数,每次重启都会清零,每次错误都会加一,也可以手动使用flush host清除
排序缓冲区大小:每个需要进行排序的线程分配该大小的一个缓冲区,order by ,oroup by,distinct,union都会涉及
此参数不是越大越好,由于是connection级的参数,过大的设置_高并发会好近系统内存资源
配置方法:
修改配置文件
sort_buffer_size=1M
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
用于表间关联缓存的大小,和sort_buffer_size一样,该参数分配的内存也是每个线程链接独享
优化方法:在ON条件列加索引,至少应该有MUL索引
这个参数越优化应当越小
服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程将被放到缓存中以响应下一个响应而不是销毁(前提是缓存数未达到上限),如果线程被重新请求,那么请求将直接从缓存中读取,如果是新的清秀,那么这个线程将会重新创建
配置依据:
通过比较connections和threads_created状态,可以看到这个变量的作用
配置规则:1G内存为8,2G内存为16,3G内存32…