//---------------------------------------------------------------------------------------------------
> SHOW VARIABLES LIKE '%query_cache%'; > SHOW STATUS LIKE 'Qcache%'; 如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况; 如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲; 如果Qcache_free_blocks的值非常大,则表明缓冲区中碎片很多。 ########################################## ###### max_allowed_packet ###### ########################################## 通信信息包是发送至MySQL服务器的单个SQL语句,或发送至客户端的单一行。 在MySQL 5.1服务器和客户端之间最大能发送的可能信息包为1GB。 当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,了能回遇到“丢失与MySQL服务器的连接”错误。 客户端和服务器均有自己的max_allowed_packet变量,因此,如你打算处理大的信息包,必须增加客户端和服务器上的该变量。 如果你正在使用mysql客户端程序,其max_allowed_packet变量的默认值为16MB。要想设置较大的值,可用下述方式启动mysql: mysql> mysql --max_allowed_packet=32M 它将信息包的大小设置为32MB。 服务器的默认max_allowed_packet值为1MB。如果服务器需要处理大的查询,可增加该值(例如,如果准备处理大的BLOB列)。例如,要想将该设置为16MB,可采用下述方式启动服务器: mysql> mysqld --max_allowed_packet=16M 也能使用选项文件来设置max_allowed_packet。要想将服务器的该变量设置为16MB,可在选项文件中增加下行内容: [mysqld] max_allowed_packet=16M 增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 如果你正是用大的BLOB值,而且未为mysqld授予为处理查询而访问足够内存的权限,也会遇到与大信息包有关的奇怪问题。如果怀疑出现了该情况,请尝试在mysqld_safe脚本开始增加ulimit -d 256000,并重启mysqld。 ########################################## ##### MySQL怎样打开和关闭数据库表 ##### ########################################## table_cache, max_connections和max_tmp_tables影响服务器保持打开的文件的最大数量。如果你增加这些值的一个或两个,你可以遇到你的操作系统每个进程打开文件描述符的数量上强加的限制。然而,你可以能在许多系统上增加该限制。请教你的OS文档找出如何做这些,因为改变限制的方法各系统有很大的不同。 table_cache与max_connections有关。例如,对于200个打开的连接,你应该让一张表的缓冲至少有200 * n,这里n是一个联结(join)中表的最大数量。 show variables like '%slow%' Max_used_connections/max_connections =0.85 ---Max_connections Key_cache_miss_rate=key_reads/key_read_requests 0.1%--Key_buffer_size 对myisam表有效 key_blocks_used/(key_blocks_used+key_blocks_used)--Key_buffer_size 对myisam表有效 Created_tmp_disk_tables / Created_tmp_tables <=0.25 --对应的变量:tmp_table_size,max_heap_table_size Open_tables 量比较大,可以调整参数table_cache thread_created 过大,请配置 thread_cache_size= 查询缓存(query cache) Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。 Qcache_free_memory:缓存中的空闲内存。 Qcache_hits:每次查询在缓存中命中时就增大 Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。 Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况) Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。 Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。 Qcache_total_blocks:缓存中块的数量。 查询缓存参数配置: | query_cache_limit | 2097152 | 超过此大小的查询将不缓存 | query_cache_min_res_unit | 4096 | 缓存块的最小大小 4K,过大,容易造成碎片和浪费 | query_cache_size | 203423744 | 查询缓存大小 | query_cache_type | ON | 缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询 | query_cache_wlock_invalidate | OFF |当有其他客户端正在对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_inserts) / Qcache_hits * 100% 排序使用情况: Sort_merge_passes | 29 | | Sort_range | 37432840 | | Sort_rows | 9178691532 | | Sort_scan | 1860569 | 调整的参数:Sort_buffer_size 文件打开数(Open_files):对应参数open_files_limit 比较合适的设置:Open_files / open_files_limit * 100% <= 75% 表锁情况: Table_locks_immediate表示立即释放表锁数 Table_locks_waited表示需要等待的表锁数 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎 thread_cache_sized : 1G —> 8 2G —> 16 3G —> 32 3G —> 64