LAMP系统MySQL数据库服务器优化技巧:对查询进行优化
每个会话的设置
下面这些设置针对于每个会话。在设置这些数字时要十分谨慎,因为它们在乘以可能存在的连接数时候,这些选项表示大量的内存!您可以通过代码修改会话中的这些数字,或者在 my.cnf 中为所有会话修改这些设置。
当 MySQL 必须要进行排序时,就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大,那么数据就必须保存到磁盘上的临时文件中,并再次进行排序。如果 sort_merge_passes 状态变量很大,这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。
清单 8. 显示排序统计信息
- mysql> SHOW STATUS LIKE "sort%";
- +-------------------+---------+
- | Variable_name | Value |
- +-------------------+---------+
- | Sort_merge_passes | 1 |
- | Sort_range | 79192 |
- | Sort_rows | 2066532 |
- | Sort_scan | 44006 |
- +-------------------+---------+
- 4 rows in set (0.00 sec)
如果 sort_merge_passes 很大,就表示需要注意 sort_buffer_size。例如, sort_buffer_size = 4M 将排序缓冲区设置为 4MB。
MySQL 也会分配一些内存来读取表。理想情况下,索引提供了足够多的信息,可以只读入所需要的行,但是有时候查询(设计不佳或数据本性使然)需要读取表中大量数据。要理解这种行为,需要知道运行了多少个 SELECT 语句,以及需要读取表中的下一行数据的次数(而不是通过索引直接访问)。实现这种功能的命令如清单 9 所示。
清单 9. 确定表扫描比率
- mysql> SHOW STATUS LIKE "com_select";
- +---------------+--------+
- | Variable_name | Value |
- +---------------+--------+
- | Com_select | 318243 |
- +---------------+--------+
- 1 row in set (0.00 sec)
- mysql> SHOW STATUS LIKE "handler_read_rnd_next";
- +-----------------------+-----------+
- | Variable_name | Value |
- +-----------------------+-----------+
- | Handler_read_rnd_next | 165959471 |
- +-----------------------+-----------+
- 1 row in set (0.00 sec)
Handler_read_rnd_next / Com_select 得出了表扫描比率 —— 在本例中是 521:1。如果该值超过 4000,就应该查看 read_buffer_size,例如 read_buffer_size = 4M。如果这个数字超过了 8M,就应该与开发人员讨论一下对这些查询进行调优了!
【编辑推荐】