mysql 优化my.cnf

常用优化参数 vim /etc/my.cnf 添加:

query_cache_type=1 #将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存
query_cache_size = 32M  #对查询进行缓存 查询缓存
table_open_cache=512  #缓存23个表 table_cache 的值在 2G 内存以下的机器中的值默认从 256 到 512个。对于有 1G 内存推荐值是 128-256。
key_buffer_size=512M #索引缓存,根据内存大小而定,如果是独立的DB服务器,可以设置高达80%的内存总量
max_connections=1000     #最大连接数 上限是看硬件配置
wait_timeout=10        #设置超时时间,能避免长连接
max_connect_errors = 100  #设置失败连接数

slow_query_log = 1  #开启慢查询日志
slow-query-log-file=/usr/local/mysql/slow.log  #这个路径对 MySQL用户具有可写权限 
long_query_time=5  #查询超过 5 秒钟的语句记录下来
log-queries-not-using-indexes =1  #没有使用索引的查询

启动查询缓存:

vim /etc/my.cnf 添加:

[mysqld] #在此字段中添加

query_cache_type=1

query_cache_size = 32M

query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。

 如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

查看:查询缓存

重启 systemctl restart mysqld

查看缓存是否开启     show variables like '%query_cache%';

mysql> show variables like '%query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 134217728 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
6 rows in set (0.01 sec)

show status like 'qcache%';  #查看缓存

mysql> show status like 'qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134009224 |
| Qcache_hits             | 1424      |
| Qcache_inserts          | 479       |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 1807      |
| Qcache_queries_in_cache | 134       |
| Qcache_total_blocks     | 283       |
+-------------------------+-----------+
8 rows in set (0.00 sec)

解释如下:

变量名 说明

1. Qcache_free_blocks 缓存中相邻内存块的个数。数目大说明可能有碎片。

Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。    减少碎片: 合适的query_cache_min_res_unit可以减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小直接相关,可以通过内存实际消耗( query_cache_size - Qcache_free_memory )除以 Qcache_queries_in_cache 计算平均缓存大小。 

可以通过 Qcache_free_blocks 来观察碎片,这个值反应了剩余的空闲块,如果这个值很多,但是 
Qcache_lowmem_prunes 却不断增加,则说明碎片太多了。可以使用 flush query cache 整理碎片,重新排序,但不会清空,清空命令是reset query cache。整理碎片期间,查询缓存无法被访问,可能导致服务器僵死一段时间,所以查询缓存不宜太大。 

 

2. Qcache_free_memory 缓存中的空闲内存大小

3. Qcache_hits 每次查询在缓存中命中时就增大。

4. Qcache_inserts 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理                                 后把结果insert到查询缓存中。次数越多,  表示查询缓存应用到的比较少,效果也就不理想

5. Qcache_lowmem_prunes #因内存不足删除缓存次数,缓存出现内存不足并且必须要进行清理,以便为更多查询提供空间的次数。返个数字最好长时间来看;如果返个数字在不断增长,就表示可能碎片非常严重,或者缓存内存很少。

如果Qcache_free_blocks比较大,说明碎片严重。 如果 free_memory 很小,说明缓存不够用了。

6. Qcache_not_cached # 表示因为query_cache_type的设置而没有被缓存的查询数量。

7. Qcache_queries_in_cache # 在当前缓存的查询(和响应)的数量。

8. Qcache_total_blocks #缓存中块的数量。

[mysqld]

symbolic-links=0        #禁止禁用符号链接,以防止各种安全风险。

query_cache_size = 32M   #数据库缓存

max_connections=500   #最大连接数

wait_timeout=10     #等待时间10s

max_connect_errors = 100   #连接的最大错误数

 

mysql> show status like 'max_used_connections';

| Max_used_connections | 27  |#当前有27个连接mysql

表高速缓存

数据库中的每个表存储在一个文件中,要读取文件的内容,你必须先打开文件,然后再读取。为了加快从文件中读取数据的过程,mysqld 对这些打开文件进行了缓存,其最大数目由 /etc/my.cnf中的 table_cache 指定

table_open_cache=512  #缓存512个表  

table_cache 的值在 2G 内存以下的机器中的值默认从 256 到 512个。

对于有 1G 内存的机器,推荐值是 128-256。

mysql>  show global status like 'open%_tables';

mysql>  show global status like 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 835   |
| Opened_tables | 906   |
+---------------+-------+
2 rows in set (0.01 sec)

Open_tables 表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小.

关键字缓冲区

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。

key_buffer_size=512M  #只跑一个MySQL服务。结合所有缓存,MySQL整体使用的缓存可以使用物理内存的80%

查看:

mysql> show status like '%key_read%';


mysql> show status like '%key_read%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_read_requests | 6     |
| Key_reads         | 3     |
+-------------------+-------+
2 rows in set (0.00 sec)

Key_reads 代表命中磁盘的请求个数,Key_read_requests 是总数, 命中磁盘的读请求数除以读请求总数就是不中比率。

命中率:(1-(Key_reads / Key_read_requests ) )*100

如果每 1,000 个请求中命中磁盘的数目超过 1 个,就应该考虑增大关键字缓冲区了。

猜你喜欢

转载自blog.csdn.net/z13615480737/article/details/82526504