原文地址:http://wenku.baidu.com/view/49087bbafd0a79563c1e72c8.html

关键字: mysql

*1, 查看 MySQL 服务器配置信息

*1. mysql> show variables;

*通过 show status 来优化 MySQL 数据库

*2, 查看 MySQL 服务器运行的各种状态值

*1. mysql> show global status;

*3, 慢查询

**1. mysql> show variables like '%slow%';

*2. +------------------+-------+

*3. | Variable_name    | Value |

*4. +------------------+-------+

*5. | log_slow_queries | OFF   |

**6. | slow_launch_time | 2     |

*7. +------------------+-------+

**8. mysql> show global status like '%slow%';

*9. +---------------------+-------+

10. | Variable_name        | Value |

11. +---------------------+-------+

12. | Slow_launch_threads  | 0     |

13. | Slow_queries         | 279   |

14. +---------------------+-------+

配置中关闭了记录慢查询(最好是打开,方便优化),超过 2 秒即为慢查询,一共有 279 条慢查询

*4, 连接数

**1. mysql> show variables like 'max_connections';

*2. +-----------------+-------+

*3. | Variable_name   | Value |

*4. +-----------------+-------+

*5. | max_connections | 500   |

*6. +-----------------+-------+

7.

**8. mysql> show global status like 'max_used_connections';

*9. +----------------------+-------+

10. | Variable_name        | Value |

11. +----------------------+-------+

12. | Max_used_connections | 498   |

13. +----------------------+-------+

设置的最大连接数是 500,而响应的连接数是 498

*max_used_connections / max_connections * 100% = 99.6% (理想值≈ 85%)

5, key_buffer_size

key_buffer_size 是对 MyISAM 表性能影响最大的一个参数,  不过数据库中多为 Innodb

**1. mysql> show variables like 'key_buffer_size';

*2. +-----------------+----------+

*3. | Variable_name   | Value    |

*4. +-----------------+----------+

*5. | key_buffer_size | 67108864 |

*6. +-----------------+----------+

7.

**8. mysql> show global status like 'key_read%';

*9. +-------------------+----------+

10. | Variable_name     | Value    |

11. +-------------------+----------+

*12. | Key_read_requests | 25629497 |

*13. | Key_reads         | 66071    |

14. +-------------------+----------+

一共有 25629497 个索引读取请求,有 66071 个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate  =  Key_reads / Key_read_requests * 100% =0.27%

需要适当加大 key_buffer_size

**1. mysql> show global status like 'key_blocks_u%';

*2. +-------------------+-------+

*3. | Variable_name     | Value |

*4. +-------------------+-------+

**5. | Key_blocks_unused | 10285 |

**6. | Key_blocks_used   | 47705 |

*7. +-------------------+-------+

Key_blocks_unused 表示未使用的缓存簇(blocks)数,Key_blocks_used 表示曾经用到的最大的 blocks 数

*Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 18% (理想值≈ 80%)

6,临时表

**1. mysql> show global status like 'created_tmp%';

*2. +-------------------------+---------+

*3. | Variable_name           | Value   |

*4. +-------------------------+---------+

*5. | Created_tmp_disk_tables | 4184337 |

*6. | Created_tmp_files       | 4124    |

*7. | Created_tmp_tables      | 4215028 |

*8. +-------------------------+---------+

每次创建临时表,Created_tmp_tables 增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables 也增加,Created_tmp_files 表示

MySQL 服务创建的临时文件文件数:

**Created_tmp_disk_tables / Created_tmp_tables * 100% =  99% (理想值<= 25%)

*1. mysql> show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');

*2. +---------------------+-----------+

*3. | Variable_name       | Value     |

*4. +---------------------+-----------+

**5. | max_heap_table_size | 134217728 |

**6. | tmp_table_size      | 134217728 |

*7. +---------------------+-----------+

需要增加 tmp_table_size

7,open table  的情况

**1. mysql> show global status like 'open%tables%';

*2. +---------------+-------+

*3. | Variable_name | Value |

*4. +---------------+-------+

**5. | Open_tables   | 1024  |

**6. | Opened_tables | 1465  |

*7. +---------------+-------+

*Open_tables 表示打开表的数量,Opened_tables 表示打开过的表数量,如果 Opened_tables 数量过大,说明配置中  table_cache(5.1.3

之后这个值叫做 table_open_cache)值可能太小,我们查询一下服务器 table_cache 值

**1. mysql> show variables like 'table_cache';

*2. +---------------+-------+

*3. | Variable_name | Value |

*4. +---------------+-------+

**5. | table_cache   | 1024  |

*6. +---------------+-------+

**Open_tables / Opened_tables * 100% =69% 理想值 (>= 85%)

*Open_tables / table_cache * 100% = 100% 理想值  (<= 95%)

*8, 进程使用情况

**1. mysql> show global status like 'Thread%';

*2. +-------------------+-------+

*3. | Variable_name     | Value |

*4. +-------------------+-------+

**5. | Threads_cached    | 31    |

**6. | Threads_connected | 239   |

**7. | Threads_created   | 2914  |

**8. | Threads_running   | 4     |

*9. +-------------------+-------+

如果我们在 MySQL 服务器配置文件中设置了 thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应

下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created 表示创建过的线程数,如果发现 Threads_created 值过大的话,

表明  MySQL 服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中 thread_cache_size 值,查询服务器

thread_cache_size 配置:

**1. mysql> show variables like 'thread_cache_size';

*2. +-------------------+-------+

*3. | Variable_name     | Value |

*4. +-------------------+-------+

**5. | thread_cache_size | 32    |

*6. +-------------------+-------+

*9, 查询缓存(query cache)

**1. mysql> show global status like 'qcache%';

*2. +-------------------------+----------+

*3. | Variable_name           | Value    |

*4. +-------------------------+----------+

*5. | Qcache_free_blocks      | 2226     |

*6. | Qcache_free_memory      | 10794944 |

*7. | Qcache_hits             | 5385458  |

*8. | Qcache_inserts          | 1806301  |

*9. | Qcache_lowmem_prunes    | 433101   |

10. | Qcache_not_cached       | 4429464  |

11. | Qcache_queries_in_cache | 7168     |

12. | Qcache_total_blocks     | 16820    |

13. +-------------------------+----------+

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 的配置:

**1. mysql> show variables like 'query_cache%';

*2. +------------------------------+----------+

*3. | Variable_name                | Value    |

*4. +------------------------------+----------+

*5. | query_cache_limit            | 33554432 |

*6. | query_cache_min_res_unit     | 4096     |

*7. | query_cache_size             | 33554432 |

*8. | query_cache_type             | ON       |

*9. | query_cache_wlock_invalidate | OFF      |

10. +------------------------------+----------+

各字段的解释:

query_cache_limit:超过此大小的查询将不缓存

query_cache_min_res_unit:缓存块的最小大小

query_cache_size:查询缓存大小

query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存  select sql_no_cache  查询

query_cache_wlock_invalidate:当有其他客户端正在对 MyISAM 表进行写操作时,如果查询在 query cache 中,是否返回 cache 结

果还是等写操作完成再读表获取结果。

query_cache_min_res_unit 的配置是一柄”双刃剑”,默认是 4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,

就容易造成内存碎片和浪费。

查询缓存碎片率  = 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%,命中率很差,可能写操作比较

频繁吧,而且可能有些碎片。

10,排序使用情况

**1. mysql> show global status like 'sort%';

*2. +-------------------+----------+

*3. | Variable_name     | Value    |

*4. +-------------------+----------+

**5. | Sort_merge_passes | 2136     |

**6. | Sort_range        | 81888    |

**7. | Sort_rows         | 35918141 |

**8. | Sort_scan         | 55269    |

*9. +-------------------+----------+

*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  并不一定能提高速度,

见  How fast can you sort data with MySQL?(引自 http://qroom.blogspot.com/2007/09/mysql-select-sort.html)

另外,增加 read_rnd_buffer_size(3.2.3 是 record_rnd_buffer_size)的值对排序的操作也有一点的好处,参见:

http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is- read_rnd_buffer_size/

11.文件打开数(open_files)

**1. mysql> show global status like 'open_files';

*2. +---------------+-------+

*3. | Variable_name | Value |

*4. +---------------+-------+

**5. | Open_files    | 821   |

*6. +---------------+-------+

7.

**8. mysql> show variables like 'open_files_limit';

*9. +------------------+-------+

10. | Variable_name    | Value |

11. +------------------+-------+

*12. | open_files_limit | 65535 |

13. +------------------+-------+

比较合适的设置:Open_files / open_files_limit * 100% <= 75%

正常

*12, 表锁情况

**1. mysql> show global status like 'table_locks%';

*2. +-----------------------+---------+

*3. | Variable_name         | Value   |

*4. +-----------------------+---------+

**5. | Table_locks_immediate | 4257944 |

**6. | Table_locks_waited    | 25182   |

*7. +-----------------------+---------+

Table_locks_immediate  表示立即释放表锁数,Table_locks_waited 表示需要等待的表锁数,如果  Table_locks_immediate /

Table_locks_waited > 5000,最好采用 InnoDB 引擎,因为 InnoDB 是行锁而 MyISAM 是表锁,对于高并发写入的应用 InnoDB 效果

会好些.

*13. 表扫描情况

**1. mysql> show global status like 'handler_read%';

*2. +-----------------------+-----------+

*3. | Variable_name         | Value     |

*4. +-----------------------+-----------+

**5. | Handler_read_first    | 108763    |

**6. | Handler_read_key      | 92813521  |

**7. | Handler_read_next     | 486650793 |

**8. | Handler_read_prev     | 688726    |

**9. | Handler_read_rnd      | 9321362   |

*10. | Handler_read_rnd_next | 153086384 |

11. +-----------------------+-----------+

各字段解释参见 http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html,调出服务器完成的查询请求次数:

**1. mysql> show global status like 'com_select';

*2. +---------------+---------+

*3. | Variable_name | Value   |

*4. +---------------+---------+

**5. | Com_select    | 2693147 |

*6. +---------------+---------+

计算表扫描率:

*表扫描率 =  Handler_read_rnd_next / Com_select

如果表扫描率超过 4000,说明进行了太多表扫描,很有可能索引没有建好,增加 read_buffer_size 值会有一些好处,但最好不要超过

8MB。

mysql调优 参数说明的更多相关文章

  1. MySQL 调优/优化的 100 个建议

    MySQL 调优/优化的 100 个建议   MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适合特定 ...

  2. MySQL 调优基础(一) CPU与进程

    一般而言,MySQL 的调优可以分为两个层面,一个是在MySQL层面上进行的调优,比如SQL改写,索引的添加,MySQL各种参数的配置:另一个层面是从操作系统的层面和硬件的层面来进行调优.操作系统的层 ...

  3. MySQL调优系列基础篇

    前言 有一段时间没有写博客了,整天都在忙,上班,录制课程,恰巧最近一段时间比较清闲,打算弄弄MYSQL数据库. 关于MySQL数据库,这里就不做过多的介绍,开源.免费等特性深受各个互联网行业喜爱,尤其 ...

  4. mysql调优 基础

    MySQL调优可以从几个方面来做: 1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样 ...

  5. Linux内核调优参数说明

    该脚本是我常用的系统安装后执行脚本,包括开机启动服务.内核.SSH优化. !/bin/sh 服务优化,(sshd.network.crond.syslog.rsyslog)服务保持默认开机启动 Ser ...

  6. mysql调优最大连接数

    一.mysql调优 1.1 报错: Mysql: error 1040: Too many connections 1.2 原因: 1.访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器 ...

  7. MySQL调优 —— Using temporary

      DBA发来一个线上慢查询问题. SQL例如以下(为突出重点省略部分内容): select distinct article0_.id, 等字段 from article_table article ...

  8. 数据库MySQL调优实战经验总结<转>

    数据库MySQL调优实战经验总结 MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证.仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设 ...

  9. MySQL调优 优化需要考虑哪些方面

    MySQL调优 优化需要考虑哪些方面   优化目标与方向定位 总体目标:使得响应时间更快,吞吐量更大. (throughout --- 吞吐量:单位时间内处理事务的数量) 如何找到需要优化的地方 使用 ...

随机推荐

  1. 自定义View常处理的回调函数

    自定义View常处理的回调函数 onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(bo ...

  2. 荐 android 如何打包自定义控件(转)

    荐 android 如何打包自定义控件(转)   目录[-] 方式一:将项目打包成jar包 方式二:项目作为一个library 设计自定义的控件对android开发人员来说,是家常便饭了,但是多次做项 ...

  3. HDU 5531 Rebuild

    2015 ACM/ICPC 长春现场赛 E题 三分. 如果节点个数是奇数,那么直接列方程可以求解,因为,如果第一个圆半径变大,必然导致最后一个圆的半径变大, 所以,节点是奇数的时候,要么无解,要么只有 ...

  4. spring+hibernate中的Result object returned from HibernateCallback isn't a List

    Ok the problem is that for executeFind() the return type is List....so there is no way to use unique ...

  5. 让MySQL数据库支持Emoji表情

    问题:Emoji 表情是按照4个字节存储的,所以传统 mysql utf-8编码只能最大存储3字节. 解决:修改MySQL(5.5.3以上版本) 编码为utf8mb4 即可存储Emoji表,同时设置 ...

  6. losbyday Linux查找命令

    PS:第一次发表博客,试一下水,晚一点修改文本格式 linux下的命令都存放在/bin /sbin /usr/bin /usr/sbin路径下等echo $PATH which 是用来查询命令存放的路 ...

  7. xCode中如何安装旧的模拟器

    http://blog.csdn.net/cmengzhongren/article/details/50414493 这里给出如何把老版本的SDK加入到新的Xcode中的方法.其实很简单,就是将老版 ...

  8. iOS_init相关信息

    第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第二.initWithCoder 是一个类在IB中创建但 ...

  9. 【亲测】Python:解决方案:Python Version 2.7 required, which was not found in the registry

    好久不更新随笔了,今天因为数据可视化作业,想抓取一些人人网好友关系数据,于是开始尝试python,用到numpy模块,安装的时候提示: 'Python Version 2.7 required, wh ...

  10. Extjs5.1中的新特性

    Ext JS 5.0.1 is a maintenance release that addresses many bugs and limitations discovered by our com ...