• 黄聪:MYSQL5.6缓存性能优化my.ini文件配置方案


    使用MYSQL版本:5.6

    [client]
    ……
    default-character-set=gbk
    default-storage-engine=MYISAM
    max_connections=1000
    max_connect_errors=500
    back_log=200
    interactive_timeout=7200
    query_cache_size=128M
    query_cache_type=1 …… table_open_cache
    =4000 …… myisam_max_sort_file_size=50G myisam_sort_buffer_size=128M key_buffer_size=1024M read_buffer_size=512M

    官方文档:

    http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html

    http://dev.mysql.com/doc/refman/5.6/en/server-default-changes.html

    1、back_log

    back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程超时。

    back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog目前系统为1024。对于Linux系统推荐设置为小于512的整数。

    查看mysql 当前系统默认back_log值,命令:

    show variables like 'back_log'; 查看当前数量

    2、interactive_timeout

    interactive_timeout是MySQL在等待一个活动连接关闭连接前等待的秒数。

    wait_timeout是MySQL在等待一个非活动连接关闭连接前等待的秒数。

    3、query_cache_size、query_cache_type

    MYSQL的查询缓存用于缓存select查询结果,并在下次接收到同样的查询请求时,不再执行实际查询处理而直接返回结果,有这样的查询缓存能提高查询的速度,使查询性能得到优化,前提条件是你有大量的相同或相似的查询,而很少改变表里的数据,否则没有必要使用此功能。可以通过Qcache_lowmem_prunes变量的值来检查是否当前的值满足你目前系统的负载。注意:如果你查询的表更新比较频繁,而且很少有 相同的查询,最好不要使用查询缓存。

    具体配置方法:

    1. 将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M。

    2. 增加一行:query_cache_type=1

    如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。但是这种情况下query_cache_size设置的大小系统是否要为其分配呢,这个问题有待于测试?

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

    如果设置为2,则只缓存在select语句中通过SQL_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.00 sec)

    主要看query_cache_sizequery_cache_type的值是否跟我们设的一致:

    这里query_cache_size的值是134217728,我们设置的是128M,实际是一样的,只是单位不同,可以自己换算下:134217728 = 128*1024*1024。

    query_cache_type设置为1,显示为ON,这个前面已经说过了。

    总之,看到上边的显示表示设置正确,但是在实际的查询中是否能够缓存查询,还需要手动测试下,我们可以通过show status like ‘%Qcache%’;语句来测试,现在我们开启了查询缓存功能,在执行查询前,我们先看看相关参数的值:

    show status like%Qcache%’;

    +————————-+———–+

    | Variable_name           | Value     |

    +————————-+———–+

    | Qcache_free_blocks      | 1         |

    | Qcache_free_memory      | 134208800 |

    | Qcache_hits             | 0         |

    | Qcache_inserts          | 0         |

    | Qcache_lowmem_prunes    | 0         |

    | Qcache_not_cached       | 2         |

    | Qcache_queries_in_cache | 0         |

    | Qcache_total_blocks     | 1         |

    +————————-+———–+

    8 rows in set (0.00 sec)

    这里顺便解释下这个几个参数的作用:

    Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。

    Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。

    Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。

    Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次 数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。

    Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。

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

    Qcache_queries_in_cache:当前缓存中缓存的查询数量。

    Qcache_total_blocks:当前缓存的block数量。

    4、table_open_cache

    table_cache 参数设置表高速缓存的数目。每个连接进来,都会至少打开一个表缓存。因此, table_open_cache 的大小应与 max_connections 的设置有关。例如,对于 200 个并行运行的连接,应该让表的缓存至少有 200 × N ,这里 N 是应用可以执行的查询的一个联接中表的最大数量。此外,还需要为临时表和文件保留一些额外的文件描述符。

    缓存机制

    当 Mysql 访问一个表时,如果该表在缓存中已经被打开,则可以直接访问缓存;如果还没有被缓存,但是在 Mysql 表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区;如果表缓存满了,则会按照一定的规则将当前未用的表释放,或者临时扩大表缓存来存放,使用表缓存的好处是可以更快速地访问表中的内容。

    参数调优

    一般来说,可以通过查看数据库运行峰值时间的状态值 Open_tables 和 Opened_tables ,判断是否需要增加 table_cache 的值(其中 open_tables 是当前打开的表的数量, Opened_tables 则是已经打开的表的数量)。即如果open_tables接近table_open_cache的时候,并且Opened_tables这个值在逐步增加,那就要考虑增加这个值的大小了。还有就是Table_locks_waited比较高的时候,也需要增加table_open_cache。

    show global status like 'open%_tables';

    如果Open_tables的值已经接近table_open_cache的值,且Opened_tables还在不断变大,则说明mysql正在将缓存的表释放以容纳新的表,此时可能需要加大table_open_cache的值。对于大多数情况,

    比较适合的值:

    Open_tables / Opened_tables >= 0.85
    Open_tables / table_open_cache <= 0.95

    如果对此参数的把握不是很准,VPS管理百科给出一个很保守的设置建议:把MySQL数据库放在生产环境中试运行一段时间,然后把参数的值调整得比Opened_tables的数值大一些,并且保证在比较高负载的极端条件下依然比Opened_tables略大。

    在mysql默认安装情况下,table_open_cache的值在2G内存以下的机器中的值默认时256到 512,如果机器有4G内存,则默认这个值是2048,但这决意味着机器内存越大,这个值应该越大,因为table_open_cache加大后,使得mysql对 SQL响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的 table_open_cache值。

    清空缓存

    执行

    flush tables;

    命令将会清空当前所有缓存的表。

    5、myisam_max_sort_file_size

    # MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
    # 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)

    6、myisam_sort_buffer_size

    # MyISAM表发生变化时重新排序所需的缓冲

    7、key_buffer_size

    1.单个key_buffer的大小不能超过4G,如果设置超过4G,就有可能遇到下面3个bug:

    http://bugs.mysql.com/bug.php?id=29446

    http://bugs.mysql.com/bug.php?id=29419

    http://bugs.mysql.com/bug.php?id=5731

    2.建议key_buffer设置为物理内存的1/4(针对MyISAM引擎),甚至是物理内存的30%~40%,如果key_buffer_size设置太大,系统就会频繁的换页,降低系统性能。因为MySQL使用操作系统的缓存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据要比索引大得多。

    3.如果机器性能优越,可以设置多个key_buffer,分别让不同的key_buffer来缓存专门的索引

    上面只是对"新手"来说的,我们还可以更深入地优化key_buffer_size,使用"show status"来查看"Key_read_requestsKey_readsKey_write_requests  以及Key_writes ",以调整到更适合你的应用的大小,Key_reads/Key_read_requests的大小正常情况下得小于0.01

    8、read_buffer_size

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

  • 相关阅读:
    Feign调用文件上传服务接口样例
    Feign调用文件下载服务接口样例
    使用Spring Security的Basic Auth认证后Postman的POST请求不成功的可能原因
    Spring Boot应用的Controller返回的集合类数据是XML格式的可能原因
    Eureka Server增加Spring Security后的服务端和客户端配置
    Spring Data支持的关键字
    JPA(Hibernate)代理类的hibernateLazyInitializer属性系列化异常
    Spring Boot中fastjson的@JSONField(format = "yyyy-MM-dd HH:mm:ss")失效可能原因
    使用Java代码配置MyBatis Generator
    CentOS8.1中搭建Nexus3服务器
  • 原文地址:https://www.cnblogs.com/huangcong/p/5218461.html
Copyright © 2020-2023  润新知