八、排序使用情况

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。