八、排序使用情况
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>showglobalstatuslike‘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。
后记:
文中提到一些数字都是参考值,了解基本原理就可以,除了mysql提供的各种status值外,操作系统的一些性能指标也很重要,比如常用的top,iostat等,尤其是iostat,现在的系统瓶颈一般都在磁盘io上,关于iostat的使用