八、排序使用情况
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?(引自,貌似被墙)
另外,增加read_rnd_buffer_size(3.2.3是record_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 |+-----------------------+-------------+
各字段解释参见,调出服务器完成的查询请求次数:
mysql> show global status like 'com_select';
+---------------+-----------+| variable_name | value |+---------------+-----------+| com_select | 222693559 |+---------------+-----------+
计算表扫描率:
表扫描率 = handler_read_rnd_next / com_select
如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8mb。