• show global status;

    可以列出MySQL服务器运行各种状态值
    image.png

    • show variables like ‘%slow%’;

    查询慢查询是否开启,日志存放路径,超时时间
    image.png

    • show global status like ‘%slow%’;

    查询慢查询数量,线程数
    image.png

    • show variables like ‘max_connections’;

    查询这台mysql服务器最大连接数
    image.png

    • show global status like ‘Max_used_connections’;

    查询这台mysql服务器响应的最大连接数
    image.png
    —-Max_used_connections / max_connections * 100%(如果最大连接数占上限连接数的比例在10%以下,MySQL服务器连接数上限设置的过高了)

    • show variables like ‘key_buffer_size’;

    查看给key_buffer_size分配了多少内存
    image.png

    • show global status like ‘key_read%’;

    查看共有多少个索引读取请求(Key_read_requests),以及多少个请求在内存中没有找到并直接从硬盘读取索引(Key_reads)
    image.png
    计算索引未命中缓存的概率:key_cache_miss_rate = Key_reads / Key_read_requests * 100%
    key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在0.01%以下的话,key_buffer_size分配的过多,可以适当减少

    • show global status like ‘key_blocks_u%’;

    查看mysql服务器的缓存簇(blocks)数
    image.png
    Key_blocks_unused 表示未使用的缓存簇(blocks)数
    Key_blocks_used表示曾经用到的最大的缓存簇(blocks)数
    如果所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引,把缓存占满了
    比较理想的设置:Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

    • show global status like ‘created_tmp%’;

    查看临时表
    image.png
    每次创建临时表,Created_tmp_tables增加
    如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加
    Created_tmp_files表示MySQL服务创建的临时文件文件数
    比较理想的配置是:Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

    • show variables like ‘%_table_size%’;

    查看临时表使用的内存大小
    image.png
    只有’max_heap_table_size’规定以下的临时表才能全部放进内存,超过的就会用硬盘临时表

    • show global status like ‘open%tables%’;

    查看打开表的情况
    image.png
    Open_tables 表示打开表的数量
    Opened_tables表示打开过的表数量

    • show variables like ‘table_open_cache’;

    查看表缓存值
    image.png
    如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小
    比较合适的值为:
    Open_tables / Opened_tables 100% >= 85%
    Open_tables / table_open_cache
    100% <= 95%

    • show global status like ‘Thread%’;

    查看线程使用情况
    image.png
    如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户 而不是销毁(前提是缓存数未达上限)。
    Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值

    • show variables like ‘thread_cache_size’;

    查看服务器thread_cache_size配置
    image.png

    • show global status like ‘qcache%’;

    查看服务器缓存
    image.png
    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:缓存中块的数量

    • show variables like ‘query_cache%’;

    查询服务器query_cache的配置
    image.png
    query_cache_limit:超过此大小的查询将不缓存
    query_cache_min_res_unit:缓存块的最小大小
    —query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费
    query_cache_size:查询缓存大小
    query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
    query_cache_wlock_invalidate:当有其他客户端正在对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%
    —示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率差,可能写操作比较频繁吧,而且可能有些碎片

    • show global status like ‘sort%’;

    查询排序使用情况
    image.png
    Sort_merge_passes包括两步。MySQL首先会尝试在内存中做排序,使用的内存大小由系统变量Sort_buffer_size决定,如果它的大小不够把所有的记录都读到内存中,MySQL就会把每次在内存中排序的结果存到临时文件中,等MySQL找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加Sort_merge_passes。实际上,MySQL会用另一个临时文件来存再次排序的结果,所以通常会看到Sort_merge_passes增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size会减少Sort_merge_passes 和 创建临时文件的次数,但盲目的增加Sort_buffer_size 并不一定能提高速度

    • show global status like ‘open_files’;

    查询打开文件数
    image.png

    • show variables like ‘open_files_limit’;

    image.png
    查询打开文件数限制
    比较合适的设置:Open_files / open_files_limit * 100% <= 75%

    • show global status like ‘table_locks%’;

    查询表锁情况
    image.png
    Table_locks_immediate 表示立即释放表锁数
    Table_locks_waited表示需要等待的表锁数
    如果Table_locks_immediate/Table_locks_waited>5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器Table_locks_immediate/Table_locks_waited=235,MyISAM就足够了

    • show global status like ‘handler_read%’;

    表扫描情况
    image.png

    • show global status like ‘com_select’;

    image.png
    计算表扫描率:表扫描率 = Handler_read_rnd_next / Com_select
    如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。