性能调优之mysql通过status性能优化 3

释放双眼,带上耳机,听听看~!

八、排序使用情况

mysql> show global status like 'sort%';

+——————-+————+

| variable_name      | value       |

+——————-+————+

| sort_merge_passes | 29          |

| sort_range         | 37432840    |

| sort_rows          | 9178691532 |

| sort_scan          | 1860569     |

+——————-+————+

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/

九、文件打开数(open_files)

mysql> show global status like 'open_files';

+—————+——-+

| variable_name | value |

+—————+——-+

| open_files     | 1410  |

+—————+——-+

mysql> show variables like 'open_files_limit';

+——————+——-+

| variable_name     | value |

+——————+——-+

| open_files_limit | 4590  |

+——————+——-+

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

十、表锁情况

mysql> show global status like 'table_locks%';

+———————–+———–+

| variable_name          | value      |

+———————–+———–+

| table_locks_immediate | 490206328 |

| table_locks_waited     | 2084912    |

+———————–+———–+

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就足够了。

十一、表扫描情况

mysql> show global status like 'handler_read%';

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

| variable_name          | value        |

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

| handler_read_first     | 5803750      |

| handler_read_key       | 6049319850  |

| handler_read_next      | 94440908210 |

| handler_read_prev      | 34822001724 |

| handler_read_rnd       | 405482605    |

| handler_read_rnd_next | 18912877839 |

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

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

mysql> show global status like 'com_select';

+—————+———–+

| variable_name | value      |

+—————+———–+

| com_select     | 222693559 |

+—————+———–+

计算表扫描率:

表扫描率 = handler_read_rnd_next / com_select

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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索